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
更多关于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
插件来初始化蓝牙适配器、扫描蓝牙设备、连接蓝牙打印机以及发送打印数据。请根据你的实际需求调整代码,并处理可能出现的异常和错误情况。