Flutter手写签名插件signature的使用

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

Flutter手写签名插件signature的使用

简介

signature 是一个Flutter插件,它提供了性能优化的手写签名画布,并允许设置自定义样式、边界和初始状态。这是一个原生的Flutter实现,因此支持所有平台。

pub package

为什么选择这个插件?

在创建此插件时,没有其他解决方案能够同时满足以下需求:

  • 在各种设备上提供所需的性能
  • 设置画布边界的能力
  • 使用之前保存的状态进行初始化的能力

升级到5.0.0+

  • 此版本不再将 Signature 包装在 Expanded 小部件中(如果您不指定尺寸)
  • 这样可以解决 Incorrect use of ParentDataWidget 错误,更多详情请参阅 issue #49
  • 如果您传递了尺寸给小部件,则无需更改任何内容。
  • 如果您在 RowColumnFlex 小部件内使用小部件且未指定尺寸,则需要自己将 Signature 包装在 Expanded 中。
  • 如果您未在上述提到的小部件中使用小部件且未指定尺寸,则无需更改任何内容,错误应从日志中消失。

使用方法

要使用此插件,请在您的 pubspec.yaml 文件中添加 signature 作为依赖项。

示例代码

下面是一个完整的示例demo,展示了如何使用 signature 插件来创建一个手写签名功能。

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Signature Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      darkTheme: ThemeData.dark().copyWith(
        primaryColor: Colors.blue,
      ),
      home: const Home(),
    );
  }
}

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

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final SignatureController _controller = SignatureController(
    penStrokeWidth: 5,
    penColor: Colors.red,
    exportBackgroundColor: Colors.blue,
  );

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Signature Demo'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: Signature(
              controller: _controller,
              width: 300,
              height: 300,
              backgroundColor: Colors.lightBlueAccent,
            ),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  _controller.clear();
                },
                child: const Text('Clear'),
              ),
              ElevatedButton(
                onPressed: () async {
                  if (_controller.isNotEmpty) {
                    final data = await _controller.toPngBytes();
                    if (data != null) {
                      // Do something with the image bytes, e.g., save or send
                      print('Signature exported as PNG');
                    }
                  } else {
                    print('No signature provided.');
                  }
                },
                child: const Text('Export'),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

主要功能说明

  1. 导入包import 'package:signature/signature.dart';
  2. 初始化控制器final SignatureController _controller = SignatureController(...);
  3. 创建签名画布Signature(controller: _controller, ...);
  4. 清除画布_controller.clear();
  5. 导出PNG图像await _controller.toPngBytes();
  6. 检查是否有签名_controller.isNotEmpty;
  7. 导出点数据var exportedPoints = _controller.points;
  8. 销毁控制器@override void dispose() { _controller.dispose(); super.dispose(); }

通过以上步骤,您可以轻松地在Flutter应用中集成手写签名功能。希望这个示例能帮助您快速上手并实现所需的功能。

贡献和支持

  • 欢迎贡献!如果您想贡献代码,请创建一个PR。
  • 如果您发现bug或有新功能的需求,请提交issue。

更多详情请参考 GitHub项目主页


更多关于Flutter手写签名插件signature的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter手写签名插件signature的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,signature 插件常用于实现手写签名功能。下面是一个使用 flutter_signature_pad 插件的示例代码,它是一个非常流行的用于实现手写签名的Flutter插件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_signature_pad: ^3.0.0  # 请检查最新版本号

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

接下来,在你的 Flutter 项目中,你可以按照以下步骤实现手写签名功能:

  1. 创建一个签名页面
import 'package:flutter/material.dart';
import 'package:flutter_signature_pad/flutter_signature_pad.dart';
import 'dart:typed_data';
import 'dart:ui' as ui;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignaturePage(),
    );
  }
}

class SignaturePage extends StatefulWidget {
  @override
  _SignaturePageState createState() => _SignaturePageState();
}

class _SignaturePageState extends State<SignaturePage> {
  final GlobalKey<SignatureControllerState> _controller =
      GlobalKey<SignatureControllerState>();
  Uint8List? _signature;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Signature Pad'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: SignaturePad(
                controller: _controller,
                backgroundColor: Colors.white,
                penColor: Colors.black,
                strokeWidth: 5.0,
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _clear,
              child: Text('Clear'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _save,
              child: Text('Save'),
            ),
            if (_signature != null)
              SizedBox(
                height: 20,
                child: Image.memory(_signature!),
              ),
          ],
        ),
      ),
    );
  }

  void _clear() {
    _controller.currentState?.clear();
  }

  void _save() {
    _controller.currentState?.save().then((data) {
      setState(() {
        _signature = data;
      });
    });
  }
}
  1. 解释代码
  • 依赖引入:在 pubspec.yaml 中添加 flutter_signature_pad 依赖。
  • 主应用MyApp 是主应用类,它定义了应用的主页 SignaturePage
  • 签名页面SignaturePage 是一个有状态组件,它包含一个 SignaturePad 小部件用于绘制签名。
  • 控制器:使用 GlobalKey<SignatureControllerState> 来控制 SignaturePad
  • 保存签名:点击“Save”按钮时,调用 _save 方法,该方法会调用 save() 方法来获取签名的 Uint8List 数据。
  • 清除签名:点击“Clear”按钮时,调用 _clear 方法来清除签名。
  • 显示签名:如果 _signature 不为空,则使用 Image.memory 显示保存的签名。

这个示例展示了如何在 Flutter 应用中实现一个简单的手写签名功能,包括绘制、清除和保存签名。你可以根据需要进一步自定义和扩展这个功能。

回到顶部