fix: beri tiap tab pengaturan printer bloc sendiri

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) <noreply@anthropic.com>
This commit is contained in:
efrilm
2026-09-05 14:06:34 +07:00
co-authored by Claude Opus 5
parent 32f64a197a
commit 7986164a17
2 changed files with 33 additions and 12 deletions
+3 -4
View File
@@ -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<AppWidget> {
BlocProvider(create: (context) => getIt<VoidFormBloc>()),
BlocProvider(create: (context) => getIt<BluetoothLoaderBloc>()),
BlocProvider(create: (context) => getIt<BluetoothConnectBloc>()),
BlocProvider(create: (context) => getIt<PrinterFormBloc>()),
BlocProvider(create: (context) => getIt<PrinterLoaderBloc>()),
// PrinterFormBloc dan PrinterLoaderBloc sengaja TIDAK global: tiap tab
// pengaturan printer memakai instance sendiri, lihat
// SettingPrinterSection.
BlocProvider(create: (context) => getIt<PrintStruckBloc>()),
BlocProvider(create: (context) => getIt<SyncSettingBloc>()),
BlocProvider(create: (context) => getIt<LogoutBloc>()),
@@ -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<PrinterFormBloc>()),
BlocProvider(create: (_) => getIt<PrinterLoaderBloc>()),
],
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()),
],
),
),