apskel-pos-flutter/lib/presentation/setting/widgets/dialog_search_printer.dart

109 lines
3.0 KiB
Dart
Raw Normal View History

2025-07-30 22:38:44 +07:00
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart';
import 'package:enaklo_pos/core/utils/printer_service.dart';
class DialogSearchPrinter extends StatefulWidget {
final Function(String) onSelected;
const DialogSearchPrinter({
super.key,
required this.onSelected,
});
@override
State<DialogSearchPrinter> createState() => _DialogSearchPrinterState();
}
class _DialogSearchPrinterState extends State<DialogSearchPrinter> {
String macName = '';
String? macConnected;
bool connected = false;
List<BluetoothInfo> items = [];
Future<void> getBluetoots() async {
setState(() {
items = [];
});
if (!mounted) return;
final bool result = await PrinterService().isBluetoothEnabled();
if (result) {
final List<BluetoothInfo> listResult = await PrinterService().getPairedBluetoothDevices();
log("listResult: $listResult");
setState(() {
items = listResult;
});
}
}
Future<void> connect(String mac) async {
final bool result = await PrinterService().connectBluetoothPrinter(mac);
if (result) {
widget.onSelected(mac);
}
}
@override
void initState() {
loadPermession();
getBluetoots();
super.initState();
}
Future<void> loadPermession() async {
var status2 = await Permission.bluetoothScan.status;
log("Permession: $status2");
if (status2.isDenied) {
await Permission.bluetoothScan.request();
}
var status = await Permission.bluetoothConnect.status;
if (status.isDenied) {
await Permission.bluetoothConnect.request();
}
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Text('Search Printer'),
content: SizedBox(
width: context.deviceWidth / 2,
child: items.isEmpty
? const Padding(
padding: EdgeInsets.all(20),
child: Center(child: CircularProgressIndicator()),
)
: SizedBox(
height: 200,
child: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
subtitle: Text(items[index].macAdress),
onTap: () {
connect(items[index].macAdress);
widget.onSelected(items[index].macAdress);
Navigator.of(context).pop();
},
);
},
),
),
),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Cancel'),
),
],
);
}
}