diff --git a/lib/presentation/app_widget.dart b/lib/presentation/app_widget.dart index 50da218..0d35e52 100644 --- a/lib/presentation/app_widget.dart +++ b/lib/presentation/app_widget.dart @@ -13,8 +13,6 @@ import '../application/payment_method/payment_method_loader/payment_method_loade 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/printer/printer_form/printer_form_bloc.dart'; -import '../application/printer/printer_loader/printer_loader_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'; @@ -55,8 +53,9 @@ class _AppWidgetState extends State { 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()), diff --git a/lib/presentation/pages/main/pages/setting/sections/setting_printer_section.dart b/lib/presentation/pages/main/pages/setting/sections/setting_printer_section.dart index 7b1babc..8177ac7 100644 --- a/lib/presentation/pages/main/pages/setting/sections/setting_printer_section.dart +++ b/lib/presentation/pages/main/pages/setting/sections/setting_printer_section.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../../../../../application/printer/printer_form/printer_form_bloc.dart'; +import '../../../../../../application/printer/printer_loader/printer_loader_bloc.dart'; +import '../../../../../../injection.dart'; import '../../../../../components/page/page_title.dart'; import '../../../../../components/tab/custom_tabbar.dart'; import 'printer/setting_printer_bar.dart'; @@ -11,18 +15,36 @@ import 'printer/setting_printer_ticket.dart'; class SettingPrinterSection extends StatelessWidget { const SettingPrinterSection({super.key}); + /// Tiap tab wajib punya `PrinterFormBloc` dan `PrinterLoaderBloc` sendiri. + /// + /// Kelima tab hidup bersamaan di dalam `TabBarView`, dan `PrinterFormBloc` + /// membangun entitas `Printer` sepenuhnya dari state-nya (`type`, `address`, + /// `code`, ...). Saat blocnya dibagi, tab yang terakhir menulis state akan + /// menang, lalu tombol Simpan di tab mana pun menyimpan state milik tab lain + /// — itu sebabnya printer kitchen bisa tersimpan dengan alamat IP yang benar + /// tapi `type` "Bluetooth" warisan tab Receipt. + Widget _scoped(Widget tab) { + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => getIt()), + BlocProvider(create: (_) => getIt()), + ], + child: tab, + ); + } + @override Widget build(BuildContext context) { - return const Column( + return Column( children: [ - PageTitle( + const PageTitle( isBack: false, title: 'Printer', subtitle: 'Kelola printer untuk cetak struk', ), Expanded( child: CustomTabBar( - tabTitles: [ + tabTitles: const [ 'Receipt Printer', 'Checker Printer', 'Kitchen Printer', @@ -30,11 +52,11 @@ class SettingPrinterSection extends StatelessWidget { 'Tiket Printer', ], tabViews: [ - SettingPrinterReceipt(), - SettingPrinterChecker(), - SettingPrinterKitchen(), - SettingPrinterBar(), - SettingPrinterTicket(), + _scoped(const SettingPrinterReceipt()), + _scoped(const SettingPrinterChecker()), + _scoped(const SettingPrinterKitchen()), + _scoped(const SettingPrinterBar()), + _scoped(const SettingPrinterTicket()), ], ), ),