메인함수에서 runApp을 실행하기 이전에 처리해야 하는 작업이 있다.
해당 작업을 처리하다가 문제가 발생할 시에 문제가 발생했다는 것을 알리고 앱을 종료하고 다시 시작할 것을 유저에게 알리고 싶다.
간단하게 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('종료'))
],
),
),
);
}
}