import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flux/core/blocs/session/session_bloc.dart'; import 'package:flux/core/routes/app_router.dart'; import 'package:flux/core/theme/theme.dart'; import 'package:flux/core/theme/bloc/theme_bloc.dart'; import 'package:flux/features/auth/bloc/auth_bloc.dart'; import 'package:flux/features/company/bloc/company_bloc.dart'; import 'package:flux/features/company/data/company_repository.dart'; import 'package:flux/features/customers/blocs/customer_cubit.dart'; import 'package:flux/features/customers/data/customer_repository.dart'; import 'package:flux/features/master_data/products/blocs/product_cubit.dart'; import 'package:flux/features/master_data/products/data/product_repository.dart'; import 'package:flux/features/master_data/providers/blocs/provider_cubit.dart'; import 'package:flux/features/master_data/providers/data/provider_repository.dart'; import 'package:flux/features/master_data/staff/blocs/staff_cubit.dart'; import 'package:flux/features/master_data/staff/data/staff_repository.dart'; import 'package:flux/features/master_data/store/bloc/store_cubit.dart'; import 'package:flux/features/master_data/store/data/store_repository.dart'; import 'package:flux/features/services/blocs/services_cubit.dart'; import 'package:flux/features/services/data/services_repository.dart'; import 'package:flux/features/settings/settings.dart'; import 'package:get_it/get_it.dart'; import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await dotenv.load(fileName: ".env"); await setupLocator(); runApp( MultiBlocProvider( providers: [ BlocProvider( create: (context) => ThemeBloc()..add(LoadThemeEvent()), ), BlocProvider( create: (context) => SessionBloc()..add(AppStarted()), ), ], child: const FluxApp(), ), ); } Future setupLocator() async { final GetIt getIt = GetIt.instance; getIt.registerSingleton( await SharedPreferences.getInstance(), ); await Supabase.initialize( url: dotenv.env['SUPABASE_URL'] ?? '', anonKey: dotenv.env['SUPABASE_ANON_KEY'] ?? '', ); getIt.registerSingleton(Supabase.instance.client); getIt.registerLazySingleton(() => AppSettings()); getIt.registerLazySingleton(() => CompanyRepository()); getIt.registerLazySingleton(() => StoreRepository()); getIt.registerLazySingleton(() => CustomerRepository()); getIt.registerLazySingleton(() => ProductRepository()); getIt.registerLazySingleton(() => StaffRepository()); getIt.registerLazySingleton(() => ServicesRepository()); getIt.registerLazySingleton(() => ProviderRepository()); } class FluxApp extends StatefulWidget { const FluxApp({super.key}); @override State createState() => _FluxAppState(); } class _FluxAppState extends State { late final GoRouter _router; @override void initState() { super.initState(); // Lo creiamo una volta sola all'avvio dell'app _router = AppRouter.createRouter(context.read()); } @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider(create: (_) => AuthBloc()), BlocProvider(create: (_) => CompanyBloc()), BlocProvider( create: (_) => StoreCubit(context.read())..loadStores(), ), BlocProvider(create: (_) => CustomerCubit()), BlocProvider( create: (context) => ProductCubit(context.read()), ), BlocProvider( create: (_) => StaffCubit(context.read())..loadAllStaff(), ), BlocProvider( create: (_) => ServicesCubit(context.read()), ), BlocProvider( create: (_) => ProvidersCubit(context.read())..loadProviders(null), ), ], child: BlocBuilder( builder: (context, state) { return MaterialApp.router( title: 'FLUX Gestionale', debugShowCheckedModeBanner: false, theme: fluxLightTheme, darkTheme: fluxDarkTheme, themeMode: state.currentTheme.themeMode, routerConfig: _router, // Usa l'istanza mantenuta nello stato ); }, ), ); } }