Flutter签名功能插件sign的使用
Flutter签名功能插件sign的使用
简介
本插件旨在为 Dart 提供基本的状态管理功能。灵感来源于 QT 框架的信号-槽架构。
该插件支持所有包含 Dart SDK 的平台。对于 Flutter 应用程序,可以使用 sign_flutter
插件。
Flutter 包含了一些用于信号的小部件以及从 ChangeNotifier
和 ValueNotifier
生成信号的一些扩展。
什么是信号?
信号是一个在值改变时触发函数的类(或按请求触发)。
在此方面,Signal
类似于 Flutter 的 ChangeNotifier
或 ValueNotifier
,GetX 的可观察对象,或者 Provider 的 StateNotifier
。
Signal
有一些小差异。首先,它是独立于 Flutter 的,并且非常简单,无需控制大量情况的长代码。
它还使用 Slot
而不是回调。
基本上有三个关键点:
- Signal:
Signal
具有一个value
。当value
改变或调用sign()
时,会触发函数。 - Slot:
Slot
可以添加到所需的信号上。当添加到一个信号时,通过Slot.onValue
处理信号触发。 - MultiSignal:
MultiSignal
既是槽又是信号。它将来自不同信号的触发收集为一个槽并像单个信号一样工作。
如何使用?
- 定义一个
Signal
实现或从任何变量创建一个Signal
。
/// 从变量创建 Signal
final Signal<int> signal = 0.signal;
void f() {
signal.value++;
// 或者
signal.sign();
}
/// 定义 Signal 实现
class MySignal extends Signal<int> {
MySignal() : super(0);
void changeSomething() {
// 更改信号值以触发信号
value = newValue;
// 或使用 sign() 触发信号
sign();
}
}
- 定义一个
Slot
实现。
class MySlot extends Slot<int> {
MySlot() : super();
[@override](/user/override)
void onValue(int value) {
// 执行某些操作
}
}
在 Flutter 中,你可以创建本身就是槽的状态。你可以使用 aSignal.builder()
或 SlotWidget
。
- 将
Slot
添加到Signal
。
void f() {
// 将 Slot 添加到 Signal
signal.addSlot(MySlot());
}
特殊信号类
如果你想要在列表和映射上触发更改,你不需要使用 value = newList
这样的表达式。这种语句会显著降低性能。
你可以使用 SignalList
和 SignalMap
代替。SignalList
和 SignalMap
在更改集合内容时会触发信号。
final signalList = [].signalList;
final signalMap = {}.signalMap;
void f() {
signalList.add(1); // 触发
signalList.remove(1); // 触发
signalList.clear(); // 触发
signalList[0] = 10; // 触发
signalMap['a'] = 'b'; // 触发
signalMap.remove('a'); // 触发
}
要创建 SignalList
,请使用 SignalList
构造函数或使用 list.signalList
创建。
要创建 SignalMap
,请使用 SignalMap
构造函数或使用 map.signalMap
创建。
全局信号/全局槽
GlobalSlot
在相同类型的 GlobalSignal
发生变化时被触发,而无需将其添加到 GlobalSignal
中。
GlobalSignal
必须仅创建一次或在创建新实例之前进行处置。
void main(){
var globalCounter = GlobalCounter();
GlobalCountSlot('a');
GlobalCountSlot('b');
GlobalCountSlot('c');
GlobalCountSlot('d');
GlobalCountSlot('e');
globalCounter.value++;
// GlobalCountSlot 'a', 'b', 'c', 'd', 'e' 触发
}
class GlobalCounter extends GlobalSignal<int> {
GlobalCounter() : super(0);
void increment() {
value++;
}
void decrement() {
value--;
}
}
class GlobalCountSlot extends GlobalSlot<int, GlobalCounter> {
GlobalCountSlot(this.name);
String name;
[@override](/user/override)
void onValue(int value) {
print('GlobalCountSlot : $name : $value');
}
}
示例代码
import 'package:sign/sign.dart';
void main() async {
var slot = CounterSlot();
var counter = Counter();
counter.addSlot(slot);
Stream<int>.periodic(
Duration(seconds: 1),
(computationCount) => computationCount,
).listen((event) {
counter.value = event;
});
}
class CounterSlot extends Slot<int> {
[@override](/user/override)
void onValue(int value) {
print('CounterSlot: $value');
}
}
class Counter extends Signal<int> {
Counter() : super(0);
void increment() {
value++;
}
void decrement() {
value--;
}
}
更多关于Flutter签名功能插件sign的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter签名功能插件sign的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,如果你想实现签名功能,可以使用一些现成的插件来简化开发过程。其中一个常用的插件是 signature
插件,它允许用户在屏幕上绘制签名,并将签名保存为图像。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 signature
插件的依赖:
dependencies:
flutter:
sdk: flutter
signature: ^5.0.0
然后运行 flutter pub get
来安装依赖。
2. 使用 Signature 插件
接下来,你可以在你的 Flutter 应用中使用 Signature
插件来实现签名功能。
import 'package:flutter/material.dart';
import 'package:signature/signature.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SignatureScreen(),
);
}
}
class SignatureScreen extends StatefulWidget {
@override
_SignatureScreenState createState() => _SignatureScreenState();
}
class _SignatureScreenState extends State<SignatureScreen> {
final SignatureController _controller = SignatureController(
penStrokeWidth: 5,
penColor: Colors.black,
exportBackgroundColor: Colors.white,
);
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Signature Pad'),
),
body: Column(
children: [
Expanded(
child: Signature(
controller: _controller,
width: 300,
height: 300,
backgroundColor: Colors.grey[200]!,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () async {
if (_controller.isNotEmpty) {
final Uint8List? signatureImage = await _controller.toPngBytes();
if (signatureImage != null) {
// 你可以在这里保存或处理签名图像
print('Signature saved');
}
}
},
child: Text('Save Signature'),
),
ElevatedButton(
onPressed: () {
_controller.clear();
},
child: Text('Clear Signature'),
),
],
),
],
),
);
}
}
3. 代码解释
- SignatureController: 用于控制签名板的行为,比如笔的颜色、宽度、背景颜色等。
- Signature: 这是签名板的主要部件,用户可以在上面绘制签名。
- toPngBytes(): 将签名板上的内容转换为 PNG 格式的图像数据(
Uint8List
),你可以将其保存到本地或上传到服务器。 - clear(): 清除签名板上的所有内容。
4. 运行应用
运行应用后,你将看到一个签名板,用户可以在上面绘制签名。点击 “Save Signature” 按钮可以将签名保存为图像,点击 “Clear Signature” 按钮可以清除签名。
5. 保存签名
在 toPngBytes()
方法中,你可以将签名图像保存到本地文件系统或上传到服务器。你可以使用 path_provider
插件来获取本地文件路径,并使用 File
类来保存图像。
import 'dart:io';
import 'package:path_provider/path_provider.dart';
Future<void> saveSignature(Uint8List signatureImage) async {
final directory = await getApplicationDocumentsDirectory();
final file = File('${directory.path}/signature.png');
await file.writeAsBytes(signatureImage);
print('Signature saved to ${file.path}');
}