From 7986164a17a021ccd0f486a458b0132738425a86 Mon Sep 17 00:00:00 2001 From: efrilm Date: Sat, 5 Sep 2026 14:06:34 +0700 Subject: [PATCH] fix: beri tiap tab pengaturan printer bloc sendiri MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PrinterFormBloc dan PrinterLoaderBloc di-provide sekali secara global, sementara lima tab pengaturan printer hidup bersamaan di dalam TabBarView dan semuanya membaca-menulis state yang sama. Karena created dan updated membangun entitas Printer sepenuhnya dari state itu (type, address, code, name, paper), tab yang terakhir menulis state akan menang, lalu tombol Simpan di tab mana pun menyimpan milik tab lain. Nilai awal state kebetulan type 'Bluetooth' — itu sebabnya printer kitchen tersimpan dengan alamat IP yang benar tapi tipe Bluetooth, dan cetakannya dikirim ke radio Bluetooth untuk mencari perangkat yang tidak pernah ada. Provider global dihapus karena tidak ada tempat lain yang memakainya. Catatan: ini mencegah kerusakan baru, tidak memulihkan baris yang sudah terlanjur salah di SQLite — konfigurasi kelima tab perlu disimpan ulang. Co-Authored-By: Claude Opus 5 (1M context) --- lib/presentation/app_widget.dart | 7 ++-- .../sections/setting_printer_section.dart | 38 +++++++++++++++---- 2 files changed, 33 insertions(+), 12 deletions(-) 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()), ], ), ),