상황

메인함수에서 runApp을 실행하기 이전에 처리해야 하는 작업이 있다.

해당 작업을 처리하다가 문제가 발생할 시에 문제가 발생했다는 것을 알리고 앱을 종료하고 다시 시작할 것을 유저에게 알리고 싶다.

해결 1.

간단하게 try-catch 문을 사용하여 메인에서 에러가 발생할 수 있는 초기화 작업을 진행하고 예외가 발생하면 알림창을 띄워주는 또다른 MaterialApp을 실행하도록 분기를 나눠준다.

void main() async {
  try {
    WidgetsFlutterBinding.ensureInitialized();

    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);

    await Firebase.initializeApp();
    LoggerService.instance.init();

    final providers = await setProviders();
    runApp(
      MultiProvider(
        providers: providers,
        child: const MyApp(),
      ),
    );
  } catch (e) {
    runApp(
      MaterialApp(
        home: AlertDialog(
          title: const Text('달력일기 로딩 실패'),
          content: const Text(
              '앱을 종료하고 다시 시작해주세요.\\n앱을 다시 시작한 후에도 같은 문제가 반복될 시, 개발자 계정으로 문의 부탁드립니다.'),
          actions: [
            TextButton(
                onPressed: () {
                  exit(0);
                },
                child: const Text('종료'))
          ],
        ),
      ),
    );
  }
}