[TIL] 230713 회고

서정한·2023년 7월 13일
0

내일배움캠프 7기

목록 보기
6/66

오늘 배운 것

플러터로 써봄직한 앱을 만들면 좋겠다싶어 사이드프로젝트를 시작했다. 냉장고지도를 만들고자 한다. 만들면서 달력 라이브러리를 받아 사용하는데 앱에서 달력을 사용하는 페이지가 두곳이 있다.

그러다보니 재사용하고싶은 생각이들어 이것저것 시도하다보니 막히는 부분이 생겼다. 그것은 바로 context를 Build 메서드 밖에서도 쓰고싶은 것이었다. 인터넷을 찾다보니 Global하게 context를 쓰는 방법을 새로 배우게되었다. 써보니 완전 신세계였다!

방법은 아래와 같다.
1. GlobalKey를 갖는 변수를 생성한다.

global_variable.dart

class GlobalAccessContext {
  static final GlobalKey<NavigatorState> navigatorState =
      GlobalKey<NavigatorState>();
}
  1. main.dart에 GlobalKey를 설정한다.
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  prefs = await SharedPreferences.getInstance();
  initializeDateFormatting().then(
    (_) => runApp(
      MultiProvider(
        providers: [
          ChangeNotifierProvider(create: (context) => BottomNaviViewModel()),
          ChangeNotifierProvider(create: (context) => ShoppingViewModel()),
        ],
        child: const MyApp(),
      ),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: GlobalAccessContext.navigatorState,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: HomePage(),
    );
  }
}
  1. 사용하고싶은곳에서 아래와같이 사용한다.
class CustomCalendar extends StatelessWidget {
  CustomCalendar({
    required this.widgetName,
  }) {
    viewModel = widgetName == "ShoppingPage"
        ? GlobalAccessContext.navigatorState.currentContext!
            .read<ShoppingViewModel>()
        : "";
    focusedDay = widgetName == "ShoppingPage"
        ? GlobalAccessContext.navigatorState.currentContext!
            .watch<ShoppingViewModel>()
            .focusedDay
        : "";
  }
  String widgetName;

  var viewModel;

  var focusedDay;

사용하다보니 분명 장단이 있을거같다는 생각이 드는데 이건 사용하면서 이것저것 해봐야겠다. TIL을 이렇게 기록하는게 맞나 싶긴하지만.. 어제보다 오늘이 조금씩이지만 쌓여간다 생각한다. 내일오전에 얼른 UI개발을 끝내고 기능구현에 들어가야지..!

profile
잘부탁드립니다!

0개의 댓글