bixolon_printer 0.0.3 copy "bixolon_printer: ^0.0.3" to clipboard
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"),
      ),
    );
  }
}
14
likes
145
points
228
downloads

Publisher

verified publisheritechnolabs.tech

Weekly Downloads

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-friendly APIs.

Documentation

API reference

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on bixolon_printer

Packages that implement bixolon_printer