import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../application/auth/auth_bloc.dart'; import '../application/auth/logout/logout_bloc.dart'; import '../application/category/category_loader/category_loader_bloc.dart'; import '../application/checkout/checkout_form/checkout_form_bloc.dart'; import '../application/customer/customer_loader/customer_loader_bloc.dart'; import '../application/order/order_form/order_form_bloc.dart'; import '../application/order/order_loader/order_loader_bloc.dart'; import '../application/outlet/outlet_loader/outlet_loader_bloc.dart'; import '../application/payment_method/payment_method_loader/payment_method_loader_bloc.dart'; import '../application/printer/bluetooth/bluetooth_connect/bluetooth_connect_bloc.dart'; import '../application/printer/bluetooth/bluetooth_loader/bluetooth_loader_bloc.dart'; import '../application/printer/print_struck/print_struck_bloc.dart'; import '../application/product/product_loader/product_loader_bloc.dart'; import '../application/sync/sync_setting/sync_setting_bloc.dart'; import '../application/table/table_form/table_form_bloc.dart'; import '../application/table/table_loader/table_loader_bloc.dart'; import '../application/void/void_form/void_form_bloc.dart'; import '../common/theme/theme.dart'; import '../common/constant/app_constant.dart'; import '../injection.dart'; import 'components/dialog/dialog.dart'; import 'router/app_router.dart'; import 'router/app_router_observer.dart'; class AppWidget extends StatefulWidget { const AppWidget({super.key}); @override State createState() => _AppWidgetState(); } class _AppWidgetState extends State { final _appRouter = getIt(); @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), // PrinterFormBloc dan PrinterLoaderBloc sengaja TIDAK global: tiap tab // pengaturan printer memakai instance sendiri, lihat // SettingPrinterSection. BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), BlocProvider(create: (context) => getIt()), ], child: MaterialApp.router( debugShowCheckedModeBanner: false, title: AppConstant.appName, theme: ThemeApp.theme, routerConfig: _appRouter.config( navigatorObservers: () => [AppRouteObserver()], ), // Satu listener untuk seluruh aplikasi: cetak bisa dipicu dari banyak // halaman, dan `PrintStruckBloc` hidup di atas router jadi prosesnya // tetap jalan walau kasir sudah pindah halaman. builder: (context, child) => BlocListener( listenWhen: (previous, current) => previous.jobId != current.jobId, listener: (_, __) { // Dialog harus dibuka dari context di bawah Navigator, sementara // builder ini berada di atasnya. final navigatorContext = _appRouter.navigatorKey.currentContext; if (navigatorContext == null) return; showPrintProgressDialog(navigatorContext); }, child: child ?? const SizedBox.shrink(), ), ), ); } }