import 'package:app/core/app/router.dart'; import 'package:app/core/app/startup/domain/initialize_app.dart'; import 'package:app/core/i18n/translations.g.dart'; import 'package:app/core/ui/controller/locale_controller.dart'; import 'package:app/core/ui/controller/scale_controller.dart'; import 'package:app/core/ui/controller/theme.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:fluttery/fluttery.dart'; import 'package:fluttery/logger.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; Future main() async { // Ensures that the Flutter engine and widget binding // are initialized before using async services or plugins WidgetsFlutterBinding.ensureInitialized(); // any services App.registerDefaultServices(); final logger = App.service(); logger.debug("[MAIN] Registered all default services"); // Run initialization before building router final init = InitializeAppUseCase(); final startRoute = await init(); final themeController = ThemeController(); await themeController.init(); final scaleController = ScaleController(); final localeController = LocaleController(); runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (context) => themeController), ChangeNotifierProvider(create: (context) => scaleController), ChangeNotifierProvider(create: (context) => localeController), ], child: TranslationProvider( child: FinlogApp(router: buildAppRouter(startRoute)), ), ), ); } class FinlogApp extends StatelessWidget { final GoRouter router; const FinlogApp({super.key, required this.router}); @override Widget build(BuildContext context) { final theme = context.watch(); final textScale = context.watch(); return AnimatedBuilder( animation: theme, builder: (context, _) => MaterialApp.router( title: 'Finlog', locale: TranslationProvider.of(context).flutterLocale, supportedLocales: AppLocaleUtils.supportedLocales, localizationsDelegates: GlobalMaterialLocalizations.delegates, theme: ThemeData.light(), darkTheme: ThemeData.dark(), themeMode: theme.themeMode, routerConfig: router, builder: (context, child) => MediaQuery( data: MediaQuery.of( context, ).copyWith(textScaler: TextScaler.linear(textScale.factor)), child: child ?? Container(), ), ), ); } }