Flutter手写签名插件flutter_signature_pad的使用
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
更多关于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项目中成功实现手写签名功能!