Flutter打印功能插件super_printer的使用

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

Flutter打印功能插件super_printer的使用

特性

简单

你可以简单地下载并安装该包,并通过一个方法来实现打印功能。

可配置的Widget

你可以控制该Widget的所有部分,例如宽度、行间距等。

安装

在你的项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  super_printer: latest_version

然后在 Dart 代码中导入该包:

import 'package:super_printer/super_printer.dart';

更多详情请参阅pub.dev

配置

Android

你需要在android/app/src/main/AndroidManifest.xml文件中添加以下权限:

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

然后在同一文件中添加以下行:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

以及:

<application
    ...
    tools:replace="android:icon, android:label"
    ...

同时,在android/app/build.gradle文件中添加以下内容:

android {
    defaultConfig {
        ...
        minSdkVersion 22
        multiDexEnabled true
        ...
    }
}

iOS

你需要在ios/Runner/info.plist文件中添加以下权限:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>为了选择所需的打印机进行打印</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>为了选择所需的打印机进行打印</string>

如果你在iOS模拟器上工作可能会遇到错误,可以通过以下步骤解决:

  1. 打开 Xcode 并转到 Build Settings 标签。
  2. 在搜索框中输入 arm
  3. 找到 Exclude Architecture 部分。
  4. Debug -> any ios simulator SDK 下添加 arm7arm64

另外,确保在runApp之前调用以下代码:

WidgetsFlutterBinding.ensureInitialized();

使用

你可以通过一个方法来使用这个插件:

// 将你想要打印的Widget转换为字节流
Uint8List data = await controller.captureFromWidget(
    Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisSize: MainAxisSize.min,
      children: [
        Directionality(
            textDirection:
                Directionality.of(navigatorKey.currentContext!),
            child:
                const PrintOrderWidget(screenshotController: null)),
      ],
    ),
    pixelRatio:
        MediaQuery.of(navigatorKey.currentContext!).devicePixelRatio,
    delay: const Duration(milliseconds: 1000),
    context: navigatorKey.currentContext!);

// 硬编码添加打印机的MAC地址和名称
// 你可以使用其他包(如android上的bluetooth_connector,ios上的flutter_blue_plus)来获取打印机的MAC地址和名称
// 别忘了使用permission_handler包来请求蓝牙服务的权限
// 打印纸张宽度为384 (2英寸),576 (3英寸),832 (4英寸)
final printer = SuperPrinter();
printer.startPrinting(
    data: data,
    macAddress: '00:12:F3:19:26:A2',
    printerName: 'APEX3',
    printerType: PrinterType.apex,
    width: 576,
    feed: 2,
    printingTimes: 1,
    timeout: 120,
    onPrinting: _onPrintingResponse);

/// 处理来自包的响应
Future<void> _onPrintingResponse(PrintingStatus result) async {
    switch (result) {
      case PrintingStatus.printing:
        {
          log('正在打印...');
        }
      case PrintingStatus.failedPrint:
        {
          log('打印失败');
        }
      case PrintingStatus.platformException:
        {
          log('打印导致平台异常');
        }
      case PrintingStatus.exception:
        {
          log('打印导致异常');
        }
      case PrintingStatus.success:
        {
          log('打印成功');
        }
      default:
        {
          log('未找到状态');
        }
    }
}

小部件属性

  • data: Uint8List 表示转换为字节并发送到打印机进行打印的图像。

  • macAddress: String 打印机的MAC地址。

  • printerName: String 打印机的名称。

  • printerType: Enum 打印机类型(APEX, HPRT)。

  • width: int 图像的宽度。

  • printingTimes: int 打印次数。

  • timeout: int 打印预计完成的时间。

  • feed: int 空白行的数量。

  • onPrinting: Function 用于处理来自原生代码的响应。


示例代码

import 'dart:log';

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

import 'package:flutter/services.dart';
import 'package:screenshot/screenshot.dart';
import 'package:super_printer/printer_type.dart';
import 'package:super_printer/printing_status.dart';
import 'package:super_printer/super_printer.dart';
import 'package:super_printer_example/print_order.dart';

void main() {
  // 确保平台通道正确建立
  WidgetsFlutterBinding.ensureInitialized();
  // 运行应用
  runApp(const App());
}

final GlobalKey<NaviagtorState> navigatorKey = GlobalKey<NaviagtorState>();

class App extends StatelessWidget {
  const App({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Super Printer',
        navigatorKey: navigatorKey,
        builder: (context, child) {
          return MediaQuery(
              data: MediaQuery.of(context)
                  .copyWith(textScaler: const TextScaler.linear(1.1)),
              child: child!);
        },
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        home: const PrinterScreen());
  }
}

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

  [@override](/user/override)
  State<PrinterScreen> createState() => _PrinterScreenState();
}

class _PrinterScreenState extends State<PrinterScreen> {
  var controller = ScreenshotController();
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("Flutter Super Printer"),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: [PrintOrderWidget(screenshotController: controller)],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // 将你想要打印的Widget转换为字节流
          Uint8List data = await controller.captureFromWidget(
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: [
                  Directionality(
                      textDirection:
                          Directionality.of(navigatorKey.currentContext!),
                      child:
                          const PrintOrderWidget(screenshotController: null)),
                ],
              ),
              pixelRatio:
                  MediaQuery.of(navigatorKey.currentContext!).devicePixelRatio,
              delay: const Duration(milliseconds: 1000),
              context: navigatorKey.currentContext!);

          // 初始化打印机对象
          final printer = SuperPrinter();
          // 硬编码添加打印机的MAC地址和名称
          // 你可以使用其他包(如android上的bluetooth_connector,ios上的flutter_blue_plus)来获取打印机的MAC地址和名称
          // 别忘了使用permission_handler包来请求蓝牙服务的权限
          // 打印纸张宽度为384 (2英寸),576 (3英寸),832 (4英寸)
          printer.startPrinting(
              data: data,
              macAddress: '00:12:F3:19:26:A2',
              printerName: 'APEX3',
              printerType: PrinterType.apex,
              width: 576,
              feed: 2,
              printingTimes: 1,
              timeout: 120,
              onPrinting: _onPrintingResponse);
        },
        child: const Icon(
          Icons.print,
          color: Colors.white,
        ),
      ),
    );
  }

  /// 处理来自包的响应
  Future<void> _onPrintingResponse(PrintingStatus result) async {
    switch (result) {
      case PrintingStatus.printing:
        {
          log('正在打印...');
        }
      case PrintingStatus.failedPrint:
        {
          log('打印失败');
        }
      case PrintingStatus.platformException:
        {
          log('打印导致平台异常');
        }
      case PrintingStatus.exception:
        {
          log('打印导致异常');
        }
      case PrintingStatus.success:
        {
          log('打印成功');
        }
      default:
        {
          log('未找到状态');
        }
    }
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用super_printer插件来实现打印功能的代码案例。super_printer是一个强大的Flutter插件,支持多种打印方式,包括蓝牙、USB和网络打印等。不过,需要注意的是,具体实现可能会因设备和打印机的不同而有所差异。

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

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

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

接下来,是一个简单的示例代码,展示了如何使用super_printer进行打印:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final SuperPrinter _printer = SuperPrinter();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Super Printer Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _printDocument,
          child: Text('Print Document'),
        ),
      ),
    );
  }

  Future<void> _printDocument() async {
    try {
      // 假设我们要打印一个简单的文本文件
      String documentText = "Hello, this is a test document for Flutter super_printer!";
      
      // 将文本转换为字节数据
      List<int> data = utf8.encode(documentText);
      
      // 创建一个打印任务
      PrintTask printTask = PrintTask(
        data: data,
        title: "Test Document",
        contentType: "text/plain", // 根据实际内容类型调整
      );
      
      // 执行打印操作,这里假设我们使用蓝牙打印(具体方法根据打印机类型调整)
      // 注意:这里的bluetoothAddress需要替换为实际的蓝牙打印机地址
      String bluetoothAddress = "XX:XX:XX:XX:XX:XX"; // 替换为实际的蓝牙地址
      await _printer.printBluetooth(bluetoothAddress, printTask);
      
      // 打印成功提示
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Print Success!')),
      );
    } catch (e) {
      // 打印失败处理
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Print Failed: ${e.message}')),
      );
    }
  }
}

注意事项:

  1. 蓝牙打印:上述代码示例中使用了蓝牙打印。你需要确保设备已开启蓝牙,并且已连接到目标蓝牙打印机。同时,bluetoothAddress需要替换为实际的蓝牙打印机地址。
  2. 其他打印方式super_printer还支持USB和网络打印等多种方式。你可以根据实际需求调整打印方法,如使用printUsbprintNetwork等。
  3. 权限处理:在实际应用中,特别是涉及蓝牙和网络通信时,需要处理相应的权限申请。
  4. 错误处理:打印过程中可能会遇到各种错误,如连接失败、数据格式错误等,因此建议做好全面的错误处理。

这个示例提供了一个基础的框架,你可以根据具体需求和打印机类型进行进一步的定制和扩展。

回到顶部