import 'package:alarm/alarm.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart' show PersistentTabController; import 'firebase_options.dart'; import 'product/lang/l10n/app_localizations.dart'; import 'product/services/api_services.dart'; import 'product/services/notification_services.dart'; import 'product/services/theme_services.dart'; import 'product/services/language_services.dart'; import 'bloc/main_bloc.dart'; import 'product/base/bloc/base_bloc.dart'; import 'product/constant/navigation/navigation_router.dart'; PersistentTabController controller = PersistentTabController(initialIndex: 0); void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform, name: "sfm-notification"); FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); await Alarm.init(); runApp( BlocProvider( child: const MyApp(), blocBuilder: () => MainBloc(), ), ); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); static void setLocale(BuildContext context, Locale newLocale) { _MyAppState? state = context.findAncestorStateOfType<_MyAppState>(); state?.setLocale(newLocale); } static void setTheme(BuildContext context, ThemeData newTheme) { _MyAppState? state = context.findAncestorStateOfType<_MyAppState>(); state?.setTheme(newTheme); } } class _MyAppState extends State { Locale? _locale; ThemeData? _themeData; late MainBloc mainBloc; LanguageServices languageServices = LanguageServices(); ThemeServices themeServices = ThemeServices(); final NotificationServices notificationServices = NotificationServices(); APIServices apiServices = APIServices(); setLocale(Locale locale) { _locale = locale; mainBloc.sinkLanguage.add(_locale); } setTheme(ThemeData theme) { _themeData = theme; mainBloc.sinkTheme.add(_themeData); } @override void initState() { super.initState(); mainBloc = BlocProvider.of(context); notificationServices.initialize(); notificationServices.firebaseInit(context); notificationServices.setupInteractMessage(controller); } @override void didChangeDependencies() { languageServices.getLocale().then((locale) => {setLocale(locale)}); themeServices.getTheme().then((theme) => {setTheme(theme)}); super.didChangeDependencies(); } @override Widget build(BuildContext context) { final router = goRouter(); return StreamBuilder( stream: mainBloc.streamLanguage, initialData: _locale, builder: (context, languageSnapshot) { return StreamBuilder( stream: mainBloc.streamTheme, initialData: _themeData, builder: (context, themeSnapshot) { return MaterialApp.router( theme: themeSnapshot.data, routerConfig: router, debugShowCheckedModeBanner: false, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, locale: languageSnapshot.data, ); } ); }, ); } }