Flutter图层管理插件easylayer的使用

Flutter图层管理插件easylayer的使用

easylayer

该插件是一个用于封装Gertec产品(如SK210)所使用的Easylayer API的库。通过此插件,开发者可以直接在Dart代码中调用Java编写的API。

关于

该包的目标是封装Easylayer API,以便可以直接在Dart代码中使用。尽管存在语言差异(例如Dart不支持方法重载),但尽可能保持方法签名的一致性。

前提条件

为了使用此插件,你需要下载Easylayer SDK,并将其作为项目依赖项添加。具体步骤如下:

  1. 下载SDK文件,例如 EasyLayer-SK210-v2.1.7-release.aar
  2. 将下载的SDK文件添加到项目的 android/app/libs/ 目录中。
  3. android/app/build.gradle 文件中添加以下依赖项:
    dependencies {
        implementation files('libs/EasyLayer-SK210-v2.1.7-release.aar')
    }
    

免责声明

此插件与Gertec公司没有任何隶属关系。它是由独立开发者开发的,旨在简化与公司软件的集成。所有提及的品牌和商标均属于其各自的所有者。

完整示例Demo

下面是一个完整的示例代码,展示了如何使用 easylayer 插件来执行各种打印任务:

import 'package:easylayer/easylayer.dart';
import 'package:flutter/material.dart' hide Size, Alignment;
import 'package:flutter/services.dart' hide Size;

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(const Application());
}

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

  [@override](/user/override)
  State<Application> createState() => _ApplicationState();
}

class _ApplicationState extends State<Application> {
  final printer = Easylayer.printer;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'EasyLayer',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: const Color(0xFF027DFD),
          brightness: Brightness.light,
          primary: const Color(0xFF027DFD),
        ),
        useMaterial3: true,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: SafeArea(
          child: ListView(
            children: [
              Button(
                iconData: Icons.receipt_outlined,
                title: 'Imprimir texto (printText)',
                body: 'Imprime uma mensagem de texto pré-definida.',
                onTap: () async {
                  await printer.printText(
                    text: 'Esta é uma mensagem de texto pré-definida!',
                  );
                },
              ),
              Button(
                iconData: Icons.image_outlined,
                title: 'Imprimir imagem (printImage)',
                body: 'Imprime uma imagem pré-definida.',
                onTap: () async {
                  final byteData = await rootBundle.load(
                    'assets/images/nico.jpg',
                  );

                  final image = byteData.buffer.asUint8List();

                  await printer.printImage(
                    image: image,
                  );
                },
              ),
              Button(
                iconData: Icons.html_outlined,
                title: 'Imprimir HTML (printHtml)',
                body: 'Imprime um conteúdo HTML pré-definido.',
                onTap: () async {
                  const htmlCode = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Quick Test Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        #output {
            margin-top: 20px;
            padding: 10px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>

    <h1>Test Page</h1>

    <label for="inputText">Enter something:</label>
    <input type="text" id="inputText" placeholder="Type here...">
    <button onclick="displayText()">Submit</button>

    <div id="output"></div>

    <script>
        function displayText() {
            var input = document.getElementById("inputText").value;
            document.getElementById("output").innerText = input ? "You entered: " + input : "Please enter something!";
        }
    </script>

</body>
</html>
''';
                  await printer.printHtml(
                    htmlCode: htmlCode,
                  );
                },
              ),
              Button(
                iconData: Icons.table_rows_outlined,
                title: 'Imprimir tabela (printTable)',
                body: 'Imprime uma tabela pré-definida.',
                onTap: () async {
                  await printer.printTable(
                    header: [
                      'Show',
                      'Airing Period',
                      'IMDb Rating',
                      'Rotten Tomatoes',
                      'Letterboxd'
                    ],
                    rows: [
                      [
                        'Breaking Bad',
                        '2008-2013',
                        '9.5 IMDb',
                        '96% RT',
                        '4.6 LB'
                      ],
                      [
                        'The Sopranos',
                        '1999-2007',
                        '9.2 IMDb',
                        '92% RT',
                        '4.5 LB'
                      ],
                      [
                        'Better Call Saul',
                        '2015-2022',
                        '8.9 IMDb',
                        '98% RT',
                        '4.4 LB'
                      ],
                      [
                        'Stranger Things',
                        '2016-',
                        '8.7 IMDb',
                        '91% RT',
                        '4.3 LB'
                      ],
                    ],
                  );
                },
              ),
              Button(
                iconData: Icons.move_down_outlined,
                title: 'Rolar o papel de impressão (scrollPaper)',
                body: 'Rola em uma linha o papel de impressão.',
                onTap: () async {
                  await printer.scrollPaper(
                    lines: 1,
                  );
                },
              ),
              Button(
                iconData: Icons.cut_outlined,
                title: 'Cortar o papel de impressão',
                body: 'Realiza o corte do papel de impressão.',
                onTap: () async {
                  await printer.cutPaper(
                    cutType: CutType.PAPER_FULL_CUT,
                  );
                },
              ),
              Builder(builder: (context) {
                return Button(
                  iconData: Icons.settings_outlined,
                  title: 'Ver status',
                  body: 'Exibe o status atual da impressora',
                  onTap: () async {
                    final status = await printer.getStatus();

                    if (context.mounted) {
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(
                          content: Text(
                            status.toString(),
                          ),
                        ),
                      );
                    }
                  },
                );
              }),
              Button(
                iconData: Icons.receipt_long_outlined,
                title: 'Imprimir exemplo',
                body: 'Imprime um extenso exemplo das funcionalidades da biblioteca/impressora.',
                onTap: () async {
                  await printer.printText(
                    text: 'Este é um texto simples.',
                  );

                  await printer.printText(
                    offset: 20,
                    textFormat: const TextFormat(),
                    text: 'Este é um texto simples com offset de 20.',
                  );

                  await printer.printText(
                    text: 'Este é um texto em negrito.',
                    textFormat: const TextFormat(
                      bold: true,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto em itálico.',
                    textFormat: const TextFormat(
                      italic: true,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto com underline.',
                    textFormat: const TextFormat(
                      underscore: true,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto com em negrito e itálico com underline.',
                    textFormat: const TextFormat(
                      bold: true,
                      italic: true,
                      underscore: true,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto pequeno alinhado à esquerda.',
                    textFormat: const TextFormat(
                      fontSize: 16,
                      alignment: Alignment.LEFT,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto médio alinhado ao centro.',
                    textFormat: const TextFormat(
                      fontSize: 20,
                      alignment: Alignment.CENTER,
                    ),
                  );

                  await printer.printText(
                    text: 'Este é um texto grande alinhado à direita.',
                    textFormat: const TextFormat(
                      fontSize: 24,
                      alignment: Alignment.RIGHT,
                    ),
                  );

                  //

                  await printer.scrollPaper(lines: 3);

                  //

                  final byteData = await rootBundle.load(
                    'assets/images/nico.jpg',
                  );

                  final image = byteData.buffer.asUint8List();

                  await printer.printImage(
                    image: image,
                  );

                  await printer.printImage(
                    printConfig: const PrintConfig(
                      width: 200,
                      height: 200,
                    ),
                    image: image,
                  );

                  await printer.printImage(
                    offset: 50,
                    printConfig: const PrintConfig(
                      width: 200,
                      height: 200,
                    ),
                    image: image,
                  );

                  //

                  await printer.scrollPaper(lines: 3);

                  //

                  const htmlCode = '''
<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a test page.</p>
</body>
</html>''';

                  await printer.printHtml(
                    htmlCode: htmlCode,
                  );

                  await printer.printHtml(
                    printConfig: const PrintConfig(
                      width: 200,
                      height: 200,
                    ),
                    hasAssetsLoading: false,
                    htmlCode: htmlCode,
                  );

                  await printer.printHtml(
                    offset: 50,
                    printConfig: const PrintConfig(
                      width: 200,
                      height: 200,
                    ),
                    hasAssetsLoading: false,
                    htmlCode: htmlCode,
                  );

                  //

                  await printer.scrollPaper(lines: 3);

                  //

                  final header = [
                    'Show',
                    'Airing Period',
                    'IMDb Rating',
                    'Rotten Tomatoes',
                    'Letterboxd'
                  ];

                  final rows = [
                    [
                      'Breaking Bad',
                      '2008-2013',
                      '9.5 IMDb',
                      '96% RT',
                      '4.6 LB'
                    ],
                    [
                      'The Sopranos',
                      '1999-2007',
                      '9.2 IMDb',
                      '92% RT',
                      '4.5 LB'
                    ],
                    [
                      'Better Call Saul',
                      '2015-2022',
                      '8.9 IMDb',
                      '98% RT',
                      '4.4 LB'
                    ],
                    [
                      'Stranger Things',
                      '2016-',
                      '8.7 IMDb',
                      '91% RT',
                      '4.3 LB'
                    ],
                  ];

                  await printer.printTable(
                    rows: rows,
                  );

                  await printer.printTable(
                    header: header,
                    rows: rows,
                  );

                  await printer.printTable(
                    tableFormat: const TableFormat(
                      headerAlignment: Alignment.CENTER,
                      rowAlignment: Alignment.RIGHT,
                      fontSize: 8,
                    ),
                    header: header,
                    rows: rows,
                  );

                  //

                  await printer.scrollPaper(lines: 3);

                  const lipsum =
                      'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';

                  await printer.printText(
                    text: 'QR_CODE',
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.QR_CODE,
                    ),
                    data: lipsum,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.QR_CODE,
                      size: Size.SMALL,
                    ),
                    data: lipsum,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.QR_CODE,
                      size: Size.HALF_PAPER,
                    ),
                    data: lipsum,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.QR_CODE,
                      size: Size.FULL_PAPER,
                    ),
                    data: lipsum,
                  );

                  //

                  await printer.scrollPaper(lines: 1);

                  //

                  const ean8 = '12345678';

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_8,
                    ),
                    data: ean8,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_8,
                      size: Size.SMALL,
                    ),
                    data: ean8,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_8,
                      size: Size.HALF_PAPER,
                    ),
                    data: ean8,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_8,
                      size: Size.FULL_PAPER,
                    ),
                    data: ean8,
                  );

                  //

                  await printer.scrollPaper(lines: 1);

                  //

                  const ean13 = '7891000315507';

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_13,
                    ),
                    data: ean13,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_13,
                      size: Size.SMALL,
                    ),
                    data: ean13,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_13,
                      size: Size.HALF_PAPER,
                    ),
                    data: ean13,
                  );

                  await printer.printBarcode(
                    barcodeFormat: const BarcodeFormat(
                      barcodeType: BarcodeType.EAN_13,
                      size: Size.FULL_PAPER,
                    ),
                    data: ean13,
                  );

                  //

                  await printer.scrollPaper(lines: 1);

                  await printer.cutPaper(cutType: CutType.PAPER_FULL_CUT);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class Button extends StatelessWidget {
  final IconData? iconData;
  final String title;
  final String? body;
  final void Function()? onTap;
  final double spacer;

  const Button({
    super.key,
    this.iconData,
    required this.title,
    this.body,
    this.onTap,
    this.spacer = 8.0,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return InkWell(
      onTap: onTap,
      child: Padding(
        padding: EdgeInsets.all(spacer),
        child: Row(
          children: [
            if (iconData != null) ...[
              Icon(
                iconData,
              ),
              SizedBox(width: spacer),
            ],
            Expanded(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  Text(
                    title,
                    style: Theme.of(context).textTheme.titleMedium,
                  ),
                  if (body is String) ...[
                    Text(
                      body!,
                      style: Theme.of(context).textTheme.bodyMedium,
                    ),
                  ],
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}

更多关于Flutter图层管理插件easylayer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图层管理插件easylayer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


EasyLayer 是一个用于 Flutter 的图层管理插件,它可以帮助你在应用中轻松地管理和显示多个图层。通过 EasyLayer,你可以实现弹出层、对话框、加载层等效果,并且可以方便地控制这些图层的显示和隐藏。

安装

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

dependencies:
  flutter:
    sdk: flutter
  easylayer: ^1.0.0  # 请检查最新版本

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

基本使用

1. 初始化 EasyLayer

在使用 EasyLayer 之前,你需要在应用的顶层 Widget 中初始化它。通常,你可以将 EasyLayer 包裹在 MaterialAppCupertinoApp 外。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return EasyLayer(
      child: MaterialApp(
        title: 'EasyLayer Demo',
        home: HomePage(),
      ),
    );
  }
}

2. 显示图层

你可以使用 EasyLayer.of(context).showLayer() 方法来显示一个图层。这个方法接受一个 Widget 参数,该 Widget 将作为图层内容显示。

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('EasyLayer Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            EasyLayer.of(context).showLayer(
              child: Center(
                child: Container(
                  width: 200,
                  height: 200,
                  color: Colors.white,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text('This is a layer'),
                      ElevatedButton(
                        onPressed: () {
                          EasyLayer.of(context).hideLayer();
                        },
                        child: Text('Close'),
                      ),
                    ],
                  ),
                ),
              ),
            );
          },
          child: Text('Show Layer'),
        ),
      ),
    );
  }
}

3. 隐藏图层

你可以使用 EasyLayer.of(context).hideLayer() 方法来隐藏当前显示的图层。

ElevatedButton(
  onPressed: () {
    EasyLayer.of(context).hideLayer();
  },
  child: Text('Close'),
);

高级用法

EasyLayer 还支持一些高级功能,比如动画、背景遮罩、图层堆叠等。你可以通过传递不同的参数来定制这些功能。

1. 动画效果

你可以通过 animationDurationanimationCurve 参数来设置图层的显示和隐藏动画。

EasyLayer.of(context).showLayer(
  child: Center(
    child: Container(
      width: 200,
      height: 200,
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('This is a layer'),
          ElevatedButton(
            onPressed: () {
              EasyLayer.of(context).hideLayer();
            },
            child: Text('Close'),
          ),
        ],
      ),
    ),
  ),
  animationDuration: Duration(milliseconds: 300),
  animationCurve: Curves.easeInOut,
);

2. 背景遮罩

你可以通过 background 参数来设置图层的背景遮罩。

EasyLayer.of(context).showLayer(
  child: Center(
    child: Container(
      width: 200,
      height: 200,
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('This is a layer'),
          ElevatedButton(
            onPressed: () {
              EasyLayer.of(context).hideLayer();
            },
            child: Text('Close'),
          ),
        ],
      ),
    ),
  ),
  background: Colors.black.withOpacity(0.5),
);

3. 图层堆叠

EasyLayer 支持多个图层的堆叠显示。你可以通过多次调用 showLayer 方法来显示多个图层。

EasyLayer.of(context).showLayer(
  child: Center(
    child: Container(
      width: 200,
      height: 200,
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('Layer 1'),
          ElevatedButton(
            onPressed: () {
              EasyLayer.of(context).showLayer(
                child: Center(
                  child: Container(
                    width: 150,
                    height: 150,
                    color: Colors.white,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Text('Layer 2'),
                        ElevatedButton(
                          onPressed: () {
                            EasyLayer.of(context).hideLayer();
                          },
                          child: Text('Close'),
                        ),
                      ],
                    ),
                  ),
                ),
              );
            },
            child: Text('Show Layer 2'),
          ),
        ],
      ),
    ),
  ),
);
回到顶部