bixolon_printer 0.0.3
bixolon_printer: ^0.0.3 copied to clipboard
A Flutter plugin that provides seamless integration with Bixolon Bluetooth printers using Method Channels. Easily initialize the SDK, connect via Bluetooth, and print images using simple, developer-fr [...]
example/lib/main.dart
import 'dart:async';
import 'package:bixolon_printer/bixolon_printer.dart';
import 'package:bixolon_printer/model/print_config.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_classic/flutter_blue_classic.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(home: MainScreen());
}
}
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
final FlutterBlueClassic _flutterBlueClassic = FlutterBlueClassic();
final BixolonPrinter _bixolonPrinter = BixolonPrinter();
BluetoothAdapterState _adapterState = BluetoothAdapterState.unknown;
StreamSubscription<BluetoothAdapterState>? _adapterStateSubscription;
StreamSubscription<bool>? _scanningStateSubscription;
StreamSubscription<BluetoothDevice>? _scanSubscription;
final Set<BluetoothDevice> _scanResults = {};
bool _isScanning = false;
int? _connectingToIndex;
@override
void initState() {
super.initState();
_bixolonPrinter.intiSDK();
_initBluetooth();
}
Future<void> _initBluetooth() async {
try {
// Get current adapter state
_adapterState = await _flutterBlueClassic.adapterStateNow;
// Listen to adapter state changes
_adapterStateSubscription = _flutterBlueClassic.adapterState.listen((
state,
) {
if (mounted) setState(() => _adapterState = state);
});
// Listen to scanning state
_scanningStateSubscription = _flutterBlueClassic.isScanning.listen((
scanning,
) {
if (mounted) setState(() => _isScanning = scanning);
});
// Listen to scan results
_scanSubscription = _flutterBlueClassic.scanResults.listen((device) {
if (mounted) setState(() => _scanResults.add(device));
});
// Get bonded devices
final bondedDevices = await _flutterBlueClassic.bondedDevices;
if (bondedDevices != null) {
if (mounted) {
setState(() => _scanResults.addAll(bondedDevices));
}
}
} catch (e) {
if (kDebugMode) print("Bluetooth init error: $e");
}
if (mounted) setState(() {});
}
@override
void dispose() {
_adapterStateSubscription?.cancel();
_scanningStateSubscription?.cancel();
_scanSubscription?.cancel();
super.dispose();
}
Future<void> _toggleScan() async {
final status = await Permission.location.request();
if (!status.isGranted) return;
if (_isScanning) {
_flutterBlueClassic.stopScan();
} else {
_scanResults.clear();
_flutterBlueClassic.startScan();
}
}
Future<void> _connectAndPrint(BluetoothDevice device, int index) async {
setState(() => _connectingToIndex = index);
try {
final address = await _bixolonPrinter.connectSDK(
macAddress: device.address,
);
if (kDebugMode) print("Connected to $address");
await _bixolonPrinter.printSample(
printConfig: PrintConfig(
printQty: 1,
base64Image: "BASE64 of image",
dstHeight: 200,
dstWidth: 400,
verticalStartPosition: 5,
horizontalStartPosition: 15,
width: 400,
level: 50,
),
);
} catch (e) {
if (kDebugMode) print("Error connecting or printing: $e");
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Error connecting to device")),
);
}
} finally {
if (mounted) setState(() => _connectingToIndex = null);
}
}
@override
Widget build(BuildContext context) {
final scanResultsList = _scanResults.toList();
return Scaffold(
appBar: AppBar(title: const Text('Prep Guardian')),
body: ListView(
children: [
ListTile(
leading: const Icon(Icons.settings_bluetooth),
title: const Text("Bluetooth Adapter state"),
subtitle: const Text("Tap to enable"),
trailing: Text(_adapterState.name),
onTap: _flutterBlueClassic.turnOn,
),
const Divider(),
if (scanResultsList.isEmpty)
const Padding(
padding: EdgeInsets.all(16.0),
child: Center(child: Text("No devices found yet")),
)
else
...scanResultsList.asMap().entries.map((entry) {
final index = entry.key;
final device = entry.value;
return ListTile(
title: Text("${device.name ?? "???"} (${device.address})"),
subtitle: Text(
"Bondstate: ${device.bondState.name}, Type: ${device.type.name}",
),
trailing: index == _connectingToIndex
? const SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(strokeWidth: 2),
)
: Text("${device.rssi} dBm"),
onTap: () => _connectAndPrint(device, index),
);
}).toList(),
],
),
floatingActionButton: FloatingActionButton.extended(
onPressed: _toggleScan,
icon: Icon(_isScanning ? Icons.bluetooth_searching : Icons.bluetooth),
label: Text(_isScanning ? "Scanning..." : "Start Scan"),
),
);
}
}