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

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

fp_bt_printer 是一个用于在Android设备上通过蓝牙连接热敏打印机进行打印的Flutter插件。该插件支持58mm和80mm宽度的打印机,并允许打印QR码、条形码、图像等。

主要功能

  • 列出已配对的蓝牙设备。
  • 检查设备是否已连接。
  • 打印数据,包括文本、图像、二维码等。

示例代码

以下是一个完整的示例应用,展示了如何使用 fp_bt_printer 插件来扫描并连接到蓝牙打印机,然后打印一张带有样式和图像的收据。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  fp_bt_printer: ^x.x.x # 替换为最新版本号
  esc_pos_utils: ^x.x.x # 替换为最新版本号
  image: ^x.x.x # 替换为最新版本号

运行 flutter pub get 来安装这些依赖。

2. 创建主应用

创建一个简单的Flutter应用程序,包含以下内容:

import 'dart:typed_data';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image/image.dart' as img;
import 'package:fp_bt_printer/fp_bt_printer.dart';

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

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

class _MyAppState extends State<MyApp> {
  List<PrinterDevice> devices = [];
  PrinterDevice? device;
  bool connected = false;

  FpBtPrinter printer = FpBtPrinter();

  Future<void> getDevices() async {
    final response = await printer.scanBondedDevices();
    setState(() {
      devices = response;
    });
  }

  Future<void> setConnet(PrinterDevice d) async {
    final response = await printer.checkConnection(d.address);
    print(response.message);
    setState(() {
      if (response.success) {
        device = d;
        connected = true;
      } else {
        connected = false;
        device = null;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('List of devices - Printers'),
      ),
      body: Column(
        children: [
          Container(
            child: Column(
              children: [
                TextButton(
                  child: Center(child: Text("Open Settings")),
                  onPressed: () => printer.openSettings(),
                )
              ],
            ),
          ),
          Divider(),
          Text("Search Paired Bluetooth"),
          TextButton(
            onPressed: () {
              this.getDevices();
            },
            child: Text("Search"),
          ),
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 10.0),
            child: Card(
              child: Container(
                padding: const EdgeInsets.all(5),
                height: 200,
                child: ListView.separated(
                  separatorBuilder: (context, index) => Divider(),
                  itemCount: devices.length > 0 ? devices.length : 0,
                  itemBuilder: (context, index) {
                    return ListTile(
                      leading: Icon(Icons.print_rounded),
                      onTap: () => setConnet(devices[index]),
                      title: Text(
                          '${devices[index].name} - ${devices[index].address}'),
                      subtitle: Text("Click to connect"),
                    );
                  },
                ),
              ),
            ),
          ),
          SizedBox(
            height: 30,
          ),
          Padding(
            padding: const EdgeInsets.all(15.0),
            child: Container(
              color: Colors.grey.shade300,
              child: Column(
                children: [
                  Center(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Icon(
                        Icons.print_rounded,
                        color: connected ? Colors.green : Colors.red,
                      ),
                    ),
                  ),
                  ListTile(
                    minVerticalPadding: 5,
                    dense: true,
                    title: connected
                        ? Center(child: Text(device!.name!))
                        : Center(child: Text("No device")),
                    subtitle: connected
                        ? Center(child: Text(device!.address))
                        : Center(child: Text("Select a device of the list")),
                  ),
                  TextButton(
                    onPressed: connected
                        ? () => this.printTicket(device!.address)
                        : null,
                    child: Text("PRINT DATA"),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  Future<void> printTicket(String address) async {
    final profile = await CapabilityProfile.load();
    final generator = Generator(PaperSize.mm80, profile);
    List<int> bytes = [];

    // Print image:
    final ByteData data = await rootBundle.load('assets/wz.png');
    final Uint8List bytesImg = data.buffer.asUint8List();
    var image = img.decodePng(bytesImg);

    // Resize
    var thumbnail =
        img.copyResize(image!, interpolation: img.Interpolation.nearest, height: 200);

    bytes += generator.text("fp_bt_printer",
        styles: PosStyles(align: PosAlign.center, bold: true));

    bytes += generator.imageRaster(thumbnail, align: PosAlign.center);

    bytes += generator.reset();
    bytes += generator.setGlobalCodeTable('CP1252');
    bytes += generator.feed(1);
    bytes += generator.text("HELLO PRINTER by FPV",
        styles: PosStyles(align: PosAlign.center, bold: true));
    bytes += generator.qrcode("https://github.com/FranciscoPV94",
        size: QRSize.Size6);
    bytes += generator.feed(1);
    bytes += generator.feed(1);

    final resp = await printer.printData(bytes, address: address);

    print(resp.message);
    print("$address");
  }
}

注意事项

  • 确保你的Android设备已经开启了蓝牙,并且已经与目标打印机进行了配对。
  • 你可以在 assets 目录下放置一个名为 wz.png 的图片文件,并在 pubspec.yaml 中声明这个资源。
  • 这个插件目前仅支持Android平台。

希望这个示例能帮助你快速上手使用 fp_bt_printer 插件来实现蓝牙打印功能!


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

1 回复

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


当然,以下是如何在Flutter项目中使用fp_bt_printer插件进行蓝牙打印机操作的代码示例。fp_bt_printer是一个用于Flutter的蓝牙打印机插件,可以帮助你与蓝牙打印机进行通信和打印。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加fp_bt_printer依赖:

dependencies:
  flutter:
    sdk: flutter
  fp_bt_printer: ^x.y.z  # 请替换为最新版本号

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

2. 导入插件

在你的Dart文件中导入fp_bt_printer插件:

import 'package:fp_bt_printer/fp_bt_printer.dart';

3. 初始化并查找蓝牙设备

初始化蓝牙适配器并查找蓝牙设备:

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

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

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

class _MyAppState extends State<MyApp> {
  late BluetoothPrinter bluetoothPrinter;
  late List<BluetoothDevice> devices;

  @override
  void initState() {
    super.initState();
    bluetoothPrinter = BluetoothPrinter.instance;
    bluetoothPrinter.init();

    // 开始扫描蓝牙设备
    bluetoothPrinter.startDiscovery(
      (BluetoothDevice device) {
        // 发现设备时的回调
        setState(() {
          devices = bluetoothPrinter.discoveredDevices;
        });
      },
      () {
        // 扫描完成时的回调
        print("扫描完成");
      }
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('蓝牙打印机示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('发现的设备:'),
              ListView.builder(
                shrinkWrap: true,
                itemCount: devices.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(devices[index].name),
                    onTap: () {
                      // 连接设备
                      bluetoothPrinter.connect(devices[index].address)
                        .then((_) {
                          print("连接成功: ${devices[index].name}");
                          // 发送打印数据
                          bluetoothPrinter.sendData("Hello, Bluetooth Printer!")
                            .then((_) {
                              print("打印数据发送成功");
                            })
                            .catchError((error) {
                              print("打印数据发送失败: $error");
                            });
                        })
                        .catchError((error) {
                          print("连接失败: $error");
                        });
                    },
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 权限处理

别忘了在AndroidManifest.xml中添加必要的蓝牙权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

并且在AndroidManifest.xml中的<application>标签内添加以下内容以支持蓝牙扫描(对于Android 12及以上版本):

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<application
    ... >
    <service
        android:name="androidx.core.app.JobIntentService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="false" />
</application>

5. 运行时权限请求(可选)

对于Android 6.0及以上版本,你可能需要在运行时请求位置权限,因为蓝牙扫描在某些设备上需要位置权限。可以使用permission_handler插件来处理运行时权限请求。

总结

以上代码示例展示了如何使用fp_bt_printer插件来初始化蓝牙适配器、扫描蓝牙设备、连接蓝牙打印机以及发送打印数据。请根据你的实际需求调整代码,并处理可能出现的异常和错误情况。

回到顶部