Flutter打印功能插件gcprinter的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter打印功能插件gcprinter的使用

本插件允许Flutter应用程序使用几个简单的API在Goodcom POS打印机上打印票据。该插件支持所有Goodcom Android POS打印机。

安装

flutter pub add gcprinter

主要特性

  1. 打印文本(可以设置字体大小和对齐方式)
  2. 打印图像(可以设置对齐方式)
  3. 打印条形码或二维码(通过参数设置条形码)

开始使用

// 导入包
import 'package:gcprinter/gcprinter.dart';

功能列表

  void drawText(String strLeft,int fontLeft,String strMid,int fontMid,String strRight,int fontRight);
  void drawBarcode(String str,int align)
  void printText();
  void printImageFile(String filePath,int align,bool isAutoFeed);
  void printImage(Uint8List img ,int align,bool isAutoFeed);
// 简单易用的API
  void drawNewLine();
  void drawOneLine([int? fontSize]);
  void drawCustom(String str,int fontSize,int align);
  void drawLeftRight(String left,String right,int fontSize);
  void drawImage(String path);
  void drawQrCode(String str, int align, [int? height]);

示例

  Uint8List bytes = await _getAssetImage('assets/images/logo.png');
  Gcprinter.printImage(bytes, Gcprinter.alignCenter, false);
  Gcprinter.drawText("1 x", Gcprinter.fontSmallBold, "test", Gcprinter.fontSmallBold, "65.00", Gcprinter.fontSmallBold);
  Gcprinter.drawText("option1", Gcprinter.fontDefault, "", Gcprinter.fontDefault, "60.00", Gcprinter.fontDefault);
  Gcprinter.drawText("option2", Gcprinter.fontDefault, "", Gcprinter.fontDefault, "5.00", Gcprinter.fontDefault);
  Gcprinter.drawBarcode("test123", Gcprinter.alignCenter,Gcprinter.barcodeQrCode);
  Gcprinter.drawText("",0,"test123",Gcprinter.fontDefault,"",0);
  Gcprinter.printText(true);

不同实现方式的同一示例

  Uint8List bytes = await _getAssetImage('assets/images/logo.png');
  Gcprinter.printImage(bytes, Gcprinter.alignCenter, false);
  Gcprinter.drawText("1 x", Gcprinter.fontSmallBold, "test", Gcprinter.fontSmallBold, "65.00", Gcprinter.fontSmallBold);
  Gcprinter.drawLeftRight("option1", Gcprinter.fontDefault, "60.00", Gcprinter.fontDefault);
  Gcprinter.drawLeftRight("option2", Gcprinter.fontDefault, "5.00", Gcprinter.fontDefault);
  Gcprinter.drawQrCode("test123", Gcprinter.alignCenter);
  Gcprinter.drawCustom("test123",Gcprinter.fontDefault,Gcprinter.alignCenter);
  Gcprinter.printText(true);

示例代码

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

import 'package:flutter/services.dart';
import 'package:gcprinter/gcprinter.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,所以我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    String platformVersion='点击打印按钮测试打印';

    // 如果小部件在异步平台消息飞行时从树中移除,我们希望丢弃回复而不是调用setState来更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  Future<Uint8List> readBytes(String path) async {
    try {
      ByteData data = await rootBundle.load(path);
      Uint8List imgData = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
      return imgData;
    } catch (err) {
      rethrow;
    }
  }

  Future<Uint8List> _getAssetImage(String path) async {
    return await readBytes(path);
  }

  Future<void> _btnPirnt() async{
    Uint8List bytes = await _getAssetImage('assets/images/logo.png');
    Gcprinter.printImage(bytes, Gcprinter.alignCenter, false);
    Gcprinter.drawOneLine(Gcprinter.fontMediumBold);
    Gcprinter.drawCustom("请求时间", Gcprinter.fontMedium, Gcprinter.alignCenter);
    Gcprinter.drawCustom("10:03", Gcprinter.fontMediumBold, Gcprinter.alignCenter);
    Gcprinter.drawOneLine();
    Gcprinter.drawText("1 x", Gcprinter.fontSmallBold, "test", Gcprinter.fontSmallBold, "65.00", Gcprinter.fontSmallBold);
    Gcprinter.drawLeftRight("option1", "60.00", Gcprinter.fontDefault);
    Gcprinter.drawText("option2", Gcprinter.fontDefault, "", Gcprinter.fontDefault, "5.00", Gcprinter.fontDefault);
    Gcprinter.drawQrCode("test123", Gcprinter.alignCenter);
    Gcprinter.drawText("",0,"test123",Gcprinter.fontDefault,"",0);
    Gcprinter.drawOneLine();
    Gcprinter.drawCustom("谢谢!", Gcprinter.fontSmall, Gcprinter.alignCenter);
    Gcprinter.printText(true);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行在: $_platformVersion\n'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _btnPirnt,
          tooltip: '打印',
          child: Icon(Icons.print),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用gcprinter插件来实现打印功能的代码示例。gcprinter是一个用于Flutter的打印插件,它支持蓝牙、USB等多种打印方式。这里以蓝牙打印为例进行说明。

1. 添加依赖

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

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

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

2. 导入插件

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

import 'package:gcprinter/gcprinter.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';

注意:flutter_bluetooth_serial是一个常用于Flutter蓝牙通信的插件,你可能需要同时添加它来处理蓝牙连接。

3. 配置蓝牙权限和初始化

AndroidManifest.xml中配置蓝牙权限:

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

4. 蓝牙连接和打印

下面是一个简单的代码示例,展示如何连接到蓝牙打印机并进行打印:

import 'package:flutter/material.dart';
import 'package:gcprinter/gcprinter.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter GCPrinter Example'),
        ),
        body: BluetoothPrintScreen(),
      ),
    );
  }
}

class BluetoothPrintScreen extends StatefulWidget {
  @override
  _BluetoothPrintScreenState createState() => _BluetoothPrintScreenState();
}

class _BluetoothPrintScreenState extends State<BluetoothPrintScreen> {
  BluetoothSerial? _bluetooth;
  BluetoothDevice? _device;
  String _address = '';

  @override
  void initState() {
    super.initState();
    _bluetooth = BluetoothSerial.getInstance();
    _bluetooth!.on().then(() {
      setState(() {});
    });
  }

  Future<void> connectToDevice(String address) async {
    setState(() {
      _device = _bluetooth!.bondedDevices.firstWhere((device) {
        return device.address == address;
      }, orElse: () => null);
    });

    if (_device == null) return;

    await _device!.connect();
    await _device!.discoverServices();
    await _device!.createBond();

    setState(() {
      _address = address;
    });

    printData();
  }

  Future<void> printData() async {
    if (_device == null || !_device!.isConnected) return;

    final Uint8List data = Uint8List.fromList(
      'Hello, GCPrinter!\n'.codeUnits,
    );

    final GCPrinter printer = GCPrinter();
    printer.setPrinterType(PrinterType.bluetooth);
    printer.setBluetoothAddress(_address);

    try {
      await printer.printData(data);
      print('Data sent to printer successfully');
    } catch (e) {
      print('Error printing: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text('Select a Bluetooth printer to connect:'),
          SizedBox(height: 16),
          ..._bluetooth!.bondedDevices.map((device) {
            return ElevatedButton(
              onPressed: () => connectToDevice(device.address),
              child: Text(device.name ?? 'Unknown Device'),
            );
          }),
        ],
      ),
    );
  }
}

注意事项

  1. 权限处理:在实际应用中,你需要处理Android和iOS的权限请求,特别是在Android 12及以上版本中。
  2. 错误处理:示例代码中省略了详细的错误处理,实际应用中应添加适当的错误处理和用户反馈。
  3. 插件版本:确保使用的gcprinterflutter_bluetooth_serial插件版本兼容。
  4. 设备兼容性:不同品牌和型号的蓝牙打印机可能需要不同的初始化设置和指令,请查阅打印机手册和gcprinter文档获取更多信息。

这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和修改。

回到顶部