Skip to content

FireFlutter 설정

global context 적용

때로는 FireFlutter 에서 context 가 필요한 경우가 있다. 예를 들면, FireFlutter 의 toast 함수를 사용하며 snackbar 를 화면에 표시 할 때, 페이지가 바뀌면 (바뀌기 전 페이지의) context 가 사라지게 되어 snackbar 를 닫을 수 없는 상황이 발생한다. 이 경우, global context 를 FireFlutter 에 적용하면 페이지가 바뀌어도 snackbar 를 닫을 수 있다. 참고로 FireFlutter 에 global context 를 적용하는 옵션이지만, 가능하면 해 주는 것이 좋다.

아래의 예제는 go_router 를 사용하는데, router 의 context 를 FireFlutterService.instnace.init(globalContext: ...) 로 전달하고 있다.

  • 아래의 예제(example/lib/main.global_context.ts)는 global key 를 통해서 FireFlutter 에 global context 를 적용하고 있다. 만약, global context 를 적용하지 않는다면, home page 에서 snackbar 를 표시하고, second page 로 이동한 다음, snackbar 를 닫으려면 에러가 난다.
import 'package:fireflutter/fireflutter.dart';
import 'package:flutter/material.dart';

GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

void main() async {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      FireFlutterService.instance.init(
        globalContext: () => navigatorKey.currentContext!,
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      home: const HomeScreen(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () {
              toast(context: context, message: 'Hello, there!');
            },
            child: const Text('Hello, FireFlutter!'),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pushReplacement(
                MaterialPageRoute(
                  builder: (context) => const SecondScreen(),
                ),
              );
            },
            child: const Text('Go to second screen!'),
          ),
        ],
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: const Center(
        child: Text('Second screen!'),
      ),
    );
  }
}

go_router 의 context 를 적용하기

예제: go_router 의 Router 를 정의

final GlobalKey<NavigatorState> globalNavigatorKey = GlobalKey();

final router = GoRouter(
  navigatorKey: globalNavigatorKey,
  // ...
);

에제: global context(navator state context)를 FireFlutter 에 전달하는 예제

void main() {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      FireFlutterService.instance.init(
          globalContext: () =>
              router.routerDelegate.navigatorKey.currentContext!);
    });
  }
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: router,
    );
  }