main function Null safety Main

Future<void> main()

안드로이드만 해당합니다. iOS는 휴대폰 자체적으로 알림을 받습니다. 앱이 종료되었을때 알림 이벤트를 수신하기위해 추가한 코드인데 flutterfire 버전이 변경되면서 이 코드가 없어도 알림을 수신하게 됩니다.

Implementation

// Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
//   LogManager().addLog("${Flavor.PROD.name}) receive push message on backround: ${message.data}");
//   await Firebase.initializeApp();
//   NotificationService().firebaseMessagingBackgroundHandler(message);
// }

/// {@category Main}
Future<void> main() async {
  /// 상용 환경으로 할당합니다.
  AppConfig.appFlavor = Flavor.PROD;
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  /// _firebaseMessagingBackgroundHandler 주석을 참고하세요.
  // try {
  //   FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  // } catch (e) {
  //   LogManager().addLog(e.toString());
  // }

  /// 앱이 실행중이고 앱 화면을 보고있을때에 알림이 오는 이벤트를 리스닝합니다.
  /// 이 이벤트는 안드로이드에서만 실행됩니다. iOS에서는 fire되지 않습니다.
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    LogManager().addLog("receive push message on foreground: ${message.data}");
    NotificationService().firebaseMessagingForegroundHandler(message);
  });

  runApp(
    MultiProvider(
      /// 프로바이더들을 정의합니다. 가독성과 관리의 용이함을 위해 아래와같이 분류합니다.
      providers: [
        /// 데이터들을 저장하는 프로바이더들은 이곳에 정의합니다.
        ChangeNotifierProvider(create: (_) => FarmState()),
        ChangeNotifierProvider(create: (_) => SensorState()),
        ChangeNotifierProvider(create: (_) => GatewayState()),
        ChangeNotifierProvider(create: (_) => ReportState()),
        ChangeNotifierProvider(create: (_) => CowState()),
        ChangeNotifierProvider(create: (_) => CowGroupState()),
        ChangeNotifierProvider(create: (_) => UserState()),

        /// 뷰모델 프로바이더들은 이곳에 정의합니다.
        ChangeNotifierProvider(create: (_) => FarmLoadingScreenVM()),
        ChangeNotifierProvider(create: (_) => CowCurrentStatusScreenVM()),
        ChangeNotifierProvider(create: (_) => HomeScreenVM()),
        ChangeNotifierProvider(create: (_) => SettingsScreenVM()),
        ChangeNotifierProvider(create: (_) => CowSettingsScreenVM()),
        ChangeNotifierProvider(create: (_) => FarmInfoScreenVM()),
        ChangeNotifierProvider(create: (_) => ChatScreenVM()),
        ChangeNotifierProvider(create: (_) => DiseaseObservationCreateScreenVM()),
        ChangeNotifierProvider(create: (_) => DiseaseObservationListScreenVM()),

        /// 그 외 기타 프로바이더들은 이곳에 정의합니다.
        ChangeNotifierProvider(create: (_) => AppState()),
        ChangeNotifierProvider(create: (_) => ScrollState()),
      ],

      /// AppEntry는 최상위 위젯입니다.
      child: AppEntry(),
    ),
  );
}