import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'core/api/api_client.dart'; import 'core/auth/auth_bloc.dart'; import 'core/status/status_bloc.dart'; import 'core/chat/chat_request_bloc.dart'; import 'firebase_options.dart'; import 'router.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); runApp(const App()); } class App extends StatefulWidget { const App({super.key}); @override State createState() => _AppState(); } class _AppState extends State with WidgetsBindingObserver { late final ApiClient _apiClient; late final StatusBloc _statusBloc; late final ChatRequestBloc _chatRequestBloc; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _apiClient = ApiClient(); _statusBloc = StatusBloc(apiClient: _apiClient); _chatRequestBloc = ChatRequestBloc(apiClient: _apiClient); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); _statusBloc.close(); _chatRequestBloc.close(); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.paused || state == AppLifecycleState.detached) { _statusBloc.add(AppPaused()); } else if (state == AppLifecycleState.resumed) { _statusBloc.add(AppResumed()); } } @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider(create: (_) => AuthBloc(apiClient: _apiClient)..add(AppStarted())), BlocProvider.value(value: _statusBloc), BlocProvider.value(value: _chatRequestBloc), RepositoryProvider.value(value: _apiClient), ], child: BlocListener( listener: (context, state) { if (state is AuthAuthenticated) { _statusBloc.add(StatusLoadRequested()); } }, child: BlocBuilder( builder: (context, state) { return MaterialApp.router( title: 'Halo Bestie Mitra', routerConfig: buildRouter(context.read()), ); }, ), ), ); } }