Flutter手写签名插件flutter_signature_pad的使用

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

Flutter手写签名插件flutter_signature_pad的使用

Flutter signature pad widget 是一个Flutter组件,它允许用户通过手指在屏幕上签名,并将结果导出为图像。

开始使用此组件

这是一个非常简单的组件,允许用户通过手指在组件上绘制并能够获取绘制后的图像。对于基本用法,请参阅example文件

以下是Signature组件的基本配置:

Signature(
  color: Colors.black, // 绘制路径的颜色
  strokeWidth: 5.0, // 线条宽度
  backgroundPainter: null, // 可选的自定义绘制器,例如用于绘制水印等
  onSign: null, // 用户绘制时的回调函数
  key: null, // 允许提供GlobalKey以在用户签名后检索图像
);

API

一旦你从你的GlobalKey中获取了SignatureState,你就可以访问以下API:

  • clear: 清除绘制区域以重新开始。
  • getData: 获取绘制的图像数据。
  • hasPoints: 判断用户是否已经签名。
  • points: 获取签名的点列表。

示例代码

下面是一个完整的示例demo,展示了如何使用flutter_signature_pad创建一个可以保存、清除和改变颜色及笔触宽度的手写签名板。

import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_signature_pad/flutter_signature_pad.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(MyApp());
}

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

// 自定义水印绘制器
class _WatermarkPaint extends CustomPainter {
  final String price;
  final String watermark;

  _WatermarkPaint(this.price, this.watermark);

  @override
  void paint(ui.Canvas canvas, ui.Size size) {
    canvas.drawCircle(Offset(size.width / 2, size.height / 2), 10.8, Paint()..color = Colors.blue);
  }

  @override
  bool shouldRepaint(_WatermarkPaint oldDelegate) {
    return oldDelegate != this;
  }

  @override
  bool operator ==(Object other) => identical(this, other) || other is _WatermarkPaint && runtimeType == other.runtimeType && price == other.price && watermark == other.watermark;

  @override
  int get hashCode => price.hashCode ^ watermark.hashCode;
}

class _MyHomePageState extends State<MyHomePage> {
  ByteData _img = ByteData(0);
  var color = Colors.red;
  var strokeWidth = 5.0;
  final _sign = GlobalKey<SignatureState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('手写签名'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: Container(
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Signature(
                  color: color,
                  key: _sign,
                  onSign: () {
                    final sign = _sign.currentState;
                    debugPrint('${sign.points.length} points in the signature');
                  },
                  backgroundPainter: _WatermarkPaint("2.0", "2.0"),
                  strokeWidth: strokeWidth,
                ),
              ),
              color: Colors.black12,
            ),
          ),
          if (_img.buffer.lengthInBytes > 0)
            LimitedBox(maxHeight: 200.0, child: Image.memory(_img.buffer.asUint8List())),
          Column(
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  MaterialButton(
                      color: Colors.green,
                      onPressed: () async {
                        final sign = _sign.currentState;
                        // 获取图像数据,可选择发送到服务器或本地保存...
                        final image = await sign.getData();
                        var data = await image.toByteData(format: ui.ImageByteFormat.png);
                        sign.clear();
                        setState(() {
                          _img = data;
                        });
                        debugPrint("onPressed " + base64.encode(data.buffer.asUint8List()));
                      },
                      child: Text("保存")),
                  MaterialButton(
                      color: Colors.grey,
                      onPressed: () {
                        final sign = _sign.currentState;
                        sign.clear();
                        setState(() {
                          _img = ByteData(0);
                        });
                        debugPrint("已清除");
                      },
                      child: Text("清除")),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  MaterialButton(
                      onPressed: () {
                        setState(() {
                          color = color == Colors.green ? Colors.red : Colors.green;
                        });
                        debugPrint("颜色已更改");
                      },
                      child: Text("更改颜色")),
                  MaterialButton(
                      onPressed: () {
                        setState(() {
                          int min = 1;
                          int max = 10;
                          int selection = min + (Random().nextInt(max - min));
                          strokeWidth = selection.toDouble();
                          debugPrint("笔触宽度已更改为 $selection");
                        });
                      },
                      child: Text("更改笔触宽度")),
                ],
              ),
            ],
          )
        ],
      ),
    );
  }
}

在这个例子中,我们创建了一个包含手写签名板的应用程序。用户可以在签名板上签名,并通过按钮来保存、清除签名,或者更改签名的颜色和线条宽度。此外,还有一个自定义的水印绘制器 _WatermarkPaint 用来展示如何添加额外的自定义绘制逻辑。


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_signature_pad插件来实现手写签名的代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_signature_pad: ^3.0.0  # 请确保使用最新版本

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

2. 导入插件

在你需要使用手写签名功能的Dart文件中导入插件:

import 'package:flutter_signature_pad/flutter_signature_pad.dart';

3. 创建UI和逻辑

下面是一个完整的示例,展示了如何在Flutter应用中实现手写签名功能:

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

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

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

class SignatureScreen extends StatefulWidget {
  @override
  _SignatureScreenState createState() => _SignatureScreenState();
}

class _SignatureScreenState extends State<SignatureScreen> {
  final GlobalKey<SignaturePadState> _signaturePadKey = GlobalKey<SignaturePadState>();
  List<List<Offset>> _points = [];

  void _clear() {
    setState(() {
      _points = _signaturePadKey.currentState?.clear() ?? [];
    });
  }

  void _save() {
    final data = _signaturePadKey.currentState?.save() ?? [];
    // 这里可以处理保存逻辑,比如将数据保存到数据库或文件
    print('Saved data: $data');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Signature Pad Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            Expanded(
              child: SignaturePad(
                key: _signaturePadKey,
                backgroundColor: Colors.white,
                penColor: Colors.black,
                strokeWidth: 5.0,
                onChanged: (List<List<Offset>> value) {
                  setState(() {
                    _points = value;
                  });
                },
              ),
            ),
            SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                ElevatedButton(
                  onPressed: _clear,
                  child: Text('Clear'),
                ),
                ElevatedButton(
                  onPressed: _save,
                  child: Text('Save'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在,你可以运行你的Flutter应用,应该能够看到一个手写签名的界面,包括清除和保存签名的按钮。

注意事项

  • 确保你已经正确安装了所有依赖,并且你的Flutter环境配置正确。
  • flutter_signature_pad插件的API可能会随着版本更新而变化,因此请参考插件的官方文档以获取最新的使用方法和API。

希望这个示例能够帮助你在Flutter项目中成功实现手写签名功能!

回到顶部