Flutter打印功能插件flutter_star_prnt的使用

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

Flutter打印功能插件flutter_star_prnt的使用

flutter_star_prnt

Pub Version

Flutter插件用于Star微米打印机

基于React Native和Ionic/Cordova版本的原生代码 React Native版本 ➜ 此处 Ionic/Cordova版本 ➜ 此处

寻找维护者

我正在寻找一个能够接手此包维护的人,因为我目前不从事Flutter或Star Micromics打印机的工作。我无法验证Star Micromics原生代码的任何更改。如果您有兴趣,请打开一个issue,我一般只是希望找到一个能让我有信心你不会将该包用于其他用途的人。

从1.0.4及以下版本更新

如果您遇到问题,请运行以下命令:

rm -rf ios/Pods && rm ios/Podfile.lock && flutter clean

开始使用

import 'package:flutter_star_prnt/flutter_star_prnt.dart';

// 查找打印机
List<PortInfo> list = await StarPrnt.portDiscovery(StarPortType.All);

list.forEach((port) async {
  /// 检查状态
  await StarPrnt.checkStatus(portName: port.portName, emulation: 'StarGraphic');
});

/// 发送打印命令到打印机
PrintCommands commands = PrintCommands();
commands.push({
  'appendBitmapText': "Hello World"
});
commands.push({
  'appendCutPaper': "FullCutWithFeed"
});
await StarPrnt.print(portName: port.portName, emulation: 'StarGraphic', printCommands: commands);

Android

根据您的打印机需要以下权限:

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

iOS

对于蓝牙打印机,需要在info.plist中添加以下内容:

<key>UISupportedExternalAccessoryProtocols</key>
  <array>
    <string>jp.star-m.starpro</string>
  </array>

正在进行中

  • ❌ 在readme中添加文档

文档正在进行中,请参阅React Native或Ionic/Cordova的文档以获取命令格式


示例代码

示例代码文件

import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_star_prnt/flutter_star_prnt.dart';
import 'dart:ui' as ui;

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  GlobalKey _globalKey = new GlobalKey();
  bool isLoading = false;

  Future<Uint8List> _capturePng() async {
    try {
      RenderRepaintBoundary? boundary = _globalKey.currentContext!
          .findRenderObject() as RenderRepaintBoundary;
      ui.Image image = await boundary!.toImage(pixelRatio: 3.0);
      ByteData? byteData =
          await image.toByteData(format: ui.ImageByteFormat.png);
      final pngBytes = byteData!.buffer.asUint8List();
      return pngBytes;
    } catch (e) {
      print(e);
      return Uint8List(0);
    }
  }

  String emulationFor(String modelName) {
    String emulation = 'StarGraphic';
    if (modelName != '') {
      final em = StarMicronicsUtilities.detectEmulation(modelName: modelName);
      emulation = em!.emulation!;
    }
    return emulation;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('插件示例应用')),
        body: Column(
          children: <Widget>[
            TextButton(
              onPressed: () async {
                List<PortInfo> list =
                    await StarPrnt.portDiscovery(StarPortType.All);
                print(list);
                list.forEach((port) async {
                  print(port.portName);
                  if (port.portName?.isNotEmpty != null) {
                    print(await StarPrnt.getStatus(
                      portName: port.portName!,
                      emulation: emulationFor(port.modelName!),
                    ));

                    PrintCommands commands = PrintCommands();
                    String raster = "        Star Clothing Boutique\n" +
                        "             123 Star Road\n" +
                        "           City, State 12345\n" +
                        "\n" +
                        "Date:MM/DD/YYYY          Time:HH:MM PM\n" +
                        "--------------------------------------\n" +
                        "SALE\n" +
                        "SKU            Description       Total\n" +
                        "300678566      PLAIN T-SHIRT     10.99\n" +
                        "300692003      BLACK DENIM       29.99\n" +
                        "300651148      BLUE DENIM        29.99\n" +
                        "300642980      STRIPED DRESS     49.99\n" +
                        "30063847       BLACK BOOTS       35.99\n" +
                        "\n" +
                        "Subtotal                        156.95\n" +
                        "Tax                               0.00\n" +
                        "--------------------------------------\n" +
                        "Total                           156.95\n" +
                        "--------------------------------------\n" +
                        "\n" +
                        "Charge\n" +
                        "156.95\n" +
                        "Visa XXXX-XXXX-XXXX-0123\n" +
                        "Refunds and Exchanges\n" +
                        "Within 30 days with receipt\n" +
                        "And tags attached\n";
                    commands.appendBitmapText(text: raster);
                    print(await StarPrnt.sendCommands(
                        portName: port.portName!,
                        emulation: emulationFor(port.modelName!),
                        printCommands: commands));
                  }
                });
              },
              child: Text('从文本打印'),
            ),
            TextButton(
              onPressed: () async {
                List<PortInfo> list =
                    await StarPrnt.portDiscovery(StarPortType.All);
                print(list);
                list.forEach((port) async {
                  print(port.portName);
                  if (port.portName?.isNotEmpty != null) {
                    print(await StarPrnt.getStatus(
                      portName: port.portName!,
                      emulation: emulationFor(port.modelName!),
                    ));

                    PrintCommands commands = PrintCommands();
                    commands.appendBitmap(
                        path:
                            'https://c8.alamy.com/comp/MPCNP1/camera-logo-design-photograph-logo-vector-icons-MPCNP1.jpg');
                    print(await StarPrnt.sendCommands(
                        portName: port.portName!,
                        emulation: emulationFor(port.modelName!),
                        printCommands: commands));
                  }
                });
                setState(() {
                  isLoading = false;
                });
              },
              child: Text('从URL打印'),
            ),
            SizedBox(
              width: 576, // 3'' only
              child: RepaintBoundary(
                key: _globalKey,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Text('这是一段作为图像打印的文本,适用于3英寸宽度'),
                  ],
                ),
              ),
            ),
            TextButton(
              onPressed: () async {
                final img = await _capturePng();
                setState(() {
                  isLoading = true;
                });
                List<PortInfo> list =
                    await StarPrnt.portDiscovery(StarPortType.All);
                print(list);

                list.forEach((port) async {
                  print(port.portName);
                  if (port.portName!.isNotEmpty) {
                    print(await StarPrnt.getStatus(
                      portName: port.portName!,
                      emulation: emulationFor(port.modelName!),
                    ));

                    PrintCommands commands = PrintCommands();
                    commands.appendBitmapByte(
                      byteData: img,
                      diffusion: true,
                      bothScale: true,
                      alignment: StarAlignmentPosition.Left,
                    );
                    print(await StarPrnt.sendCommands(
                        portName: port.portName!,
                        emulation: emulationFor(port.modelName!),
                        printCommands: commands));
                  }
                });
                setState(() {
                  isLoading = false;
                });
              },
              child: Text('从生成的图像打印'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter打印功能插件flutter_star_prnt的示例代码。这个插件通常用于通过蓝牙连接的热敏打印机进行打印操作。请注意,在实际应用中,你需要确保已经正确安装并配置了蓝牙和打印机。

首先,确保在pubspec.yaml文件中添加依赖项:

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

然后,运行flutter pub get来获取依赖项。

接下来,是一个简单的Flutter应用示例,展示如何使用flutter_star_prnt插件进行打印操作:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Star Prnt Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  FlutterStarPrnt _flutterStarPrnt = FlutterStarPrnt();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Star Prnt Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _printText,
              child: Text('Print Text'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _printText() async {
    // 打印机MAC地址,需要替换为实际的打印机MAC地址
    String printerMacAddress = 'XX:XX:XX:XX:XX:XX'; 
    String textToPrint = "Hello, Flutter Star Prnt!\nThis is a test print.";

    try {
      // 初始化蓝牙连接
      bool isConnected = await _flutterStarPrnt.connect(printerMacAddress);
      if (isConnected) {
        // 发送打印指令
        bool isPrinted = await _flutterStarPrnt.printText(textToPrint);
        if (isPrinted) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Print successful!')),
          );
        } else {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Print failed.')),
          );
        }
        // 断开蓝牙连接
        await _flutterStarPrnt.disconnect();
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to connect to printer.')),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error: ${e.message}')),
      );
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击按钮时会尝试连接到指定的蓝牙打印机并打印文本。你需要替换printerMacAddress为实际的打印机MAC地址。

请注意,这个示例假设flutter_star_prnt插件提供了connectprintTextdisconnect方法。然而,实际插件的API可能会有所不同,因此请参考插件的官方文档和示例代码来确保正确实现。

此外,由于蓝牙操作是异步的,我们使用asyncawait关键字来处理异步操作,并在操作完成后显示SnackBar来通知用户打印结果。

回到顶部