Flutter动画扩展插件starxpand的使用

Flutter动画扩展插件starxpand的使用

StarXpand SDK for Flutter

pub package likes popularity pub points

一个用于使用Star Micronics打印机的StarXpand包装器。

通过此插件,您的应用程序可以在Android和iOS上轻松打印到Star打印机。

前提条件

  1. 部署目标为iOS 12.0或更高版本。
  2. Android的minSdkVersion为21或更高版本。

iOS

如果需要,在info.plist中添加读取协议(https://github.com/star-micronics/StarXpand-SDK-iOS):

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

在info.plist中添加元素(https://github.com/star-micronics/StarXpand-SDK-iOS):

<key>NSBluetoothAlwaysUsageDescription</key>
<string>我们的应用使用蓝牙来查找、连接和打印到Star打印机。</string>

<key>NSBluetoothPeripheralUsageDescription</key>
<string>我们的应用使用蓝牙来查找、连接和打印到Star打印机。</string>

<key>NSLocalNetworkUsageDescription</key>
<string>我们的应用使用局域网来查找、连接和打印到Star打印机。</string>

安装

pubspec.yaml文件中添加starxpand:

dependencies:
  starxpand:

导入starxpand:

import 'package:starxpand/starxpand.dart';

开始使用

查找打印机:

var printers = await StarXpand.findPrinters();
setState(() {
    _printers = printers;
});

打印:

var doc = StarXpandDocument();
var printDoc = StarXpandDocumentPrint();

printDoc.actionPrintText("SKU         Description    Total\n"
    "--------------------------------\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"
    "300638471   BLACK BOOTS    35.99\n"
    "Subtotal                  156.95\n"
    "Tax                         0.00\n"
    "--------------------------------\n");

printDoc.actionPrintText("Total     ");

printDoc.add(StarXpandDocumentPrint()
    ..style(magnification: StarXpandStyleMagnification(2, 2))
    ..actionPrintText("   \$156.95\n"));

doc.addPrint(printDoc);
doc.addDrawer(StarXpandDocumentDrawer());

StarXpand.printDocument(printer, doc);

可用API

StarXpand.findPrinters(interfaces, timeout, callback);

StarXpand.openDrawer(printer);
StarXpand.printDocument(printer, document);
StarXpand.startInputListener(printer);
StarXpand.stopInputListener(printer, guid);

示例代码

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

import 'package:http/http.dart' as http;

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

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

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

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

class _MyAppState extends State<MyApp> {
  List<StarXpandPrinter>? printers;

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

  // 平台消息是异步的,因此我们初始化在一个异步方法中。
  Future<void> _find() async {
    var ps = await StarXpand.findPrinters(
        callback: (payload) => print('printer: $payload'));
    setState(() {
      printers = ps;
    });
  }

  _openDrawer(StarXpandPrinter printer) {
    StarXpand.openDrawer(printer);
  }

  _startInputListener(StarXpandPrinter printer) {
    StarXpand.startInputListener(
        printer, (p) => print('_startInputListener: ${p.inputString}'));
  }

  _print(StarXpandPrinter printer) async {
    var doc = StarXpandDocument();
    var printDoc = StarXpandDocumentPrint();

    http.Response response = await http.get(
      Uri.parse('https://ovatu.com/marketing/images/ovatu/logo-large-navy.png'),
    );

    printDoc.actionPrintImage(response.bodyBytes, 350);

    printDoc.style(
        internationalCharacter: StarXpandStyleInternationalCharacter.usa,
        characterSpace: 0.0,
        alignment: StarXpandStyleAlignment.center);
    printDoc.actionPrintText("Star Clothing Boutique\n"
        "123 Star Road\n"
        "City, State 12345\n");

    printDoc.style(alignment: StarXpandStyleAlignment.left);
    printDoc.actionPrintText("Date:MM/DD/YYYY    Time:HH:MM PM\n"
        "--------------------------------\n");

    printDoc.add(StarXpandDocumentPrint()
      ..style(bold: true)
      ..actionPrintText("SALE\n"));

    printDoc.actionPrintText("SKU         Description    Total\n"
        "--------------------------------\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"
        "300638471   BLACK BOOTS    35.99\n"
        "Subtotal                  156.95\n"
        "Tax                         0.00\n"
        "--------------------------------\n");

    printDoc.actionPrintText("Total     ");

    printDoc.add(StarXpandDocumentPrint()
      ..style(magnification: StarXpandStyleMagnification(2, 2))
      ..actionPrintText("   \$156.95\n"));

    printDoc.actionPrintText("--------------------------------\n"
        "Charge\n"
        "156.95\n"
        "Visa XXXX-XXXX-XXXX-0123\n");

    printDoc.add(StarXpandDocumentPrint()
      ..style(invert: true)
      ..actionPrintText("Refunds and Exchanges\n"));

    printDoc.actionPrintText("Within ");

    printDoc.add(StarXpandDocumentPrint()
      ..style(underLine: true)
      ..actionPrintText("30 days"));

    printDoc.actionPrintText(" with receipt\n");
    printDoc.actionPrintText("And tags attached\n\n");

    printDoc.style(alignment: StarXpandStyleAlignment.center);

    printDoc.actionPrintBarcode("0123456",
        symbology: StarXpandBarcodeSymbology.jan8,
        barDots: 3,
        height: 5,
        printHri: true);

    printDoc.actionFeedLine(1);

    printDoc.actionPrintQRCode("Hello, World\n",
        level: StarXpandQRCodeLevel.l, cellSize: 8);

    printDoc.actionCut(StarXpandCutType.partial);

    doc.addPrint(printDoc);
    doc.addDrawer(StarXpandDocumentDrawer());

    StarXpand.printDocument(printer, doc);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(children: [
          TextButton(child: Text('FInd'), onPressed: () => _find()),
          if (printers != null)
            for (var p in printers!)
              ListTile(
                  onTap: () => _print(p),
                  title: Text(p.model.label),
                  subtitle: Text(p.identifier),
                  trailing: Text(p.interface.name))
        ]),
      ),
    );
  }
}

更多关于Flutter动画扩展插件starxpand的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画扩展插件starxpand的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用starxpand插件来实现动画扩展的代码示例。starxpand插件(假设它类似于其他动画扩展插件)可以帮助你在Flutter应用中创建复杂的动画效果。由于starxpand这个具体名称在Flutter社区中并不常见,这里我将以一个假设的动画扩展插件为基础,展示如何在Flutter中实现类似的功能。

假设我们有一个名为animated_expander的插件,它提供了动画扩展的功能。以下是如何在Flutter中使用它的一个示例:

  1. 添加依赖: 首先,在你的pubspec.yaml文件中添加animated_expander依赖(注意:这里animated_expander是假设的插件名,实际使用时请替换为真实的插件名):

    dependencies:
      flutter:
        sdk: flutter
      animated_expander: ^x.y.z  # 替换为实际的版本号
    
  2. 导入插件: 在你的Dart文件中导入插件:

    import 'package:animated_expander/animated_expander.dart';
    
  3. 使用插件: 下面是一个完整的示例,展示如何使用AnimatedExpander(假设的组件名)来实现一个简单的动画扩展效果:

    import 'package:flutter/material.dart';
    import 'package:animated_expander/animated_expander.dart'; // 假设的导入
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Animated Expander Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: AnimatedExpanderDemo(),
        );
      }
    }
    
    class AnimatedExpanderDemo extends StatefulWidget {
      @override
      _AnimatedExpanderDemoState createState() => _AnimatedExpanderDemoState();
    }
    
    class _AnimatedExpanderDemoState extends State<AnimatedExpanderDemo> with SingleTickerProviderStateMixin {
      bool isExpanded = false;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Animated Expander Demo'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'Click the button to expand/collapse',
                  style: TextStyle(fontSize: 24),
                ),
                SizedBox(height: 20),
                AnimatedExpander( // 假设的组件
                  expanded: isExpanded,
                  duration: Duration(seconds: 1),
                  curve: Curves.easeInOut,
                  header: Text(
                    isExpanded ? 'Collapse' : 'Expand',
                    style: TextStyle(fontSize: 20, color: Colors.blue),
                  ),
                  builder: (context, expanded) {
                    return Container(
                      height: expanded ? 200 : 0,
                      color: Colors.lightBlueAccent,
                      child: Center(
                        child: Text(
                          'This is the expanded content!',
                          style: TextStyle(fontSize: 18, color: Colors.white),
                        ),
                      ),
                    );
                  },
                  onToggle: (newValue) {
                    setState(() {
                      isExpanded = newValue;
                    });
                  },
                ),
              ],
            ),
          ),
        );
      }
    }
    

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个可展开的动画部分。当用户点击按钮时,内容部分会以动画形式展开或折叠。

  • AnimatedExpander是一个假设的组件,它接受多个参数,包括expanded(当前是否展开)、duration(动画持续时间)、curve(动画曲线)、header(头部内容)以及一个builder函数,用于构建展开或折叠时的内容。
  • onToggle回调函数用于在展开或折叠状态改变时更新状态。

请注意,由于starxpand插件在Flutter社区中并不常见,上述代码示例是基于假设的animated_expander插件编写的。如果你使用的是特定的动画扩展插件,请参考该插件的官方文档以获取正确的使用方法和API。

回到顶部