Flutter蓝牙打印机插件bx_btprinter的使用

Flutter蓝牙打印机插件bx_btprinter的使用

bx_btprinter

此插件支持在Bixolon蓝牙打印机上进行收据打印。它已在Bixolon SPP-R310打印机上进行了测试,并支持Bixolon的蓝牙移动打印机。此外,它仅支持韩语字符集进行打印。

开始使用

要在您的Flutter项目中使用btPrinter,请将其添加到您的pubspec.yaml文件中:

dependencies:
  bx_btprinter: ^0.0.8 # 请替换为最新版本

使用方法

1. 请求蓝牙权限

Future<void> requestBluetoothPermissions() async {
  final _btprinterPlugin = Btprinter();
  String? result;
  try {
    result = await _btprinterPlugin.getBtPermission();
  } on PlatformException catch (e) {
    result = 'Error: ${e.message}';
  }
  print(result); // 如果权限被授予,将打印 "success"
}

2. 获取已配对设备

Future<void> getPairedDevices() async {
  final _btprinterPlugin = Btprinter();
  List<String?> devices = [];
  try {
    List<Object?> result = await _btprinterPlugin.getPairedDevices();
    devices = result.cast<String>().where((device) => device.startsWith('SPP')).toList();
  } on PlatformException catch (e) {
    print('Error: ${e.message}');
  }
  print(devices); // 打印已配对设备列表
}

3. 打印文本

Future<void> printText(String device) async {
  final _btprinterPlugin = Btprinter();

  List<String> deviceInfo = device.split('(');
  String logicalName = deviceInfo[0].split("_")[0].trim();
  String address = deviceInfo[1].replaceAll(')', '').trim();

  List<Map<String, dynamic>> textRequests = [
    {
      'text': '打印标题测试\n',
      'textAlignment': Btprinter.ALIGNMENT_CENTER,
      'textAttribute': Btprinter.ATTRIBUTE_BOLD,
      'textSize': 2,
    },
    {
      'text': '打印内容测试\n\n',
      'textAlignment': Btprinter.ALIGNMENT_LEFT,
      'textAttribute': Btprinter.ATTRIBUTE_NORMAL,
      'textSize': 1,
    },
  ];

  String? result;
  try {
    result = await _btprinterPlugin.printText(textRequests, logicalName, address);
  } on PlatformException catch (e) {
    result = 'Error: ${e.message}';
  }
  print(result); // 如果打印成功,将打印 "Success"。如果失败,会抛出包含 "connectingFailed" 的异常。
}

4. 打印条形码

Future<void> printBarcode(String device) async {
  final _btprinterPlugin = Btprinter();

  List<String> deviceInfo = device.split('(');
  String logicalName = deviceInfo[0].split("_")[0].trim();
  String address = deviceInfo[1].replaceAll(')', '').trim();

  List<Map<String, dynamic>> barcodeRequests = [
    {
      'data': '123456789012\n',
      'symbology': Btprinter.BARCODE_TYPE_ITF, // 可选,默认值
      'width': 3, // 可选,默认值
      'height': 100, // 可选,默认值
      'alignment': Btprinter.ALIGNMENT_LEFT, // 可选,默认值
      'hri': Btprinter.BARCODE_HRI_BELOW, // 可选,默认值
    },
  ];

  String? result;
  try {
    result = await _btprinterPlugin.printBarcode(barcodeRequests, logicalName, address);
  } on PlatformException catch (e) {
    result = 'Error: ${e.message}';
  }
  print(result); // 如果打印成功,将打印 "success"
}

完整示例

以下是一个完整的示例,展示了如何使用bx_btprinter插件来请求蓝牙权限、获取已配对设备并打印文本和条形码。

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'webview.dart';
import 'package:bx_btprinter/btprinter.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

Future<void> main() async {
  await dotenv.load(fileName: '.env');
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _btprinterPlugin = Btprinter(); // 调用插件

  @override
  void initState() {
    super.initState();

    initBle(); // 初始化蓝牙连接
  }

  void initBle() async {
    // 请求BLE权限
    await _getBle();
  }

  Future<void> _getBle() async {
    String? value;
    try {
      // value = await platform.invokeMethod('getBle');
      value = await _btprinterPlugin.getBtPermission();
    } on PlatformException catch (e) {
      value = 'native code error: ${e.message}';
    }
    // print(value);
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); // 设置为全屏模式,无导航栏

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        backgroundColor: Colors.white, // 设置背景颜色为白色
        body: WebViewContainer(),
      ),
    );
  }
}

更多关于Flutter蓝牙打印机插件bx_btprinter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙打印机插件bx_btprinter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用bx_btprinter插件来连接和操作蓝牙打印机,你可以按照以下步骤进行。以下是一个简单的代码示例,展示了如何使用该插件进行蓝牙打印机的初始化、搜索、连接和打印操作。

首先,确保你已经在pubspec.yaml文件中添加了bx_btprinter插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  bx_btprinter: ^最新版本号  # 请替换为实际可用的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下代码结构来实现蓝牙打印机的功能:

import 'package:flutter/material.dart';
import 'package:bx_btprinter/bx_btprinter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  BxBtPrinter? printer;
  List<BxBtDevice> devices = [];
  bool isScanning = false;

  @override
  void initState() {
    super.initState();
    printer = BxBtPrinter();
    printer!.init().then((_) {
      // 初始化成功,开始扫描设备
      startScan();
    }).catchError((error) {
      print("初始化失败: $error");
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Bluetooth Printer Demo'),
        ),
        body: Column(
          children: [
            if (isScanning)
              Text('正在扫描设备...')
            else
              ElevatedButton(
                onPressed: startScan,
                child: Text('开始扫描'),
              ),
            Expanded(
              child: ListView.builder(
                itemCount: devices.length,
                itemBuilder: (context, index) {
                  BxBtDevice device = devices[index];
                  return ListTile(
                    title: Text("${device.name} - ${device.address}"),
                    onTap: () {
                      connectToDevice(device);
                    },
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }

  void startScan() {
    if (isScanning) return;
    isScanning = true;
    setState(() {});
    printer!.startScan().listen((BxBtDevice device) {
      // 发现新设备
      setState(() {
        devices.add(device);
      });
    }, onError: (error) {
      print("扫描错误: $error");
      isScanning = false;
      setState(() {});
    }, onDone: () {
      // 扫描完成
      isScanning = false;
      setState(() {});
    });
  }

  void connectToDevice(BxBtDevice device) async {
    try {
      await printer!.connect(device.address);
      print("连接成功: ${device.name}");
      // 连接成功后可以执行打印操作
      printText("Hello, Bluetooth Printer!");
    } catch (error) {
      print("连接失败: $error");
    }
  }

  void printText(String text) {
    printer!.sendData(text.codeUnits);
  }
}

代码说明:

  1. 初始化插件:在initState方法中,初始化BxBtPrinter插件。
  2. 开始扫描:调用startScan方法开始扫描蓝牙设备,并将发现的设备添加到列表中。
  3. 连接设备:在设备列表中点击某个设备时,调用connectToDevice方法连接到该设备。
  4. 发送数据:连接成功后,调用printText方法发送数据(这里是简单的文本)到打印机进行打印。

注意事项:

  • 确保你的设备已经开启了蓝牙功能,并且蓝牙打印机处于可被发现的状态。
  • BxBtPrinter插件的具体API和用法可能会随着版本的更新而有所变化,请参考插件的官方文档或GitHub仓库获取最新信息。
  • 实际应用中可能需要处理更多的错误情况,例如连接超时、打印失败等。

希望这个示例能够帮助你快速上手bx_btprinter插件的使用。如果有更多问题,欢迎继续提问!

回到顶部