Flutter签名功能插件sign的使用

Flutter签名功能插件sign的使用

简介

本插件旨在为 Dart 提供基本的状态管理功能。灵感来源于 QT 框架的信号-槽架构。

该插件支持所有包含 Dart SDK 的平台。对于 Flutter 应用程序,可以使用 sign_flutter 插件。

Flutter 包含了一些用于信号的小部件以及从 ChangeNotifierValueNotifier 生成信号的一些扩展。

什么是信号?

信号是一个在值改变时触发函数的类(或按请求触发)。

在此方面,Signal 类似于 Flutter 的 ChangeNotifierValueNotifier,GetX 的可观察对象,或者 Provider 的 StateNotifier

Signal 有一些小差异。首先,它是独立于 Flutter 的,并且非常简单,无需控制大量情况的长代码。

它还使用 Slot 而不是回调。

基本上有三个关键点:

  1. SignalSignal 具有一个 value。当 value 改变或调用 sign() 时,会触发函数。
  2. SlotSlot 可以添加到所需的信号上。当添加到一个信号时,通过 Slot.onValue 处理信号触发。
  3. MultiSignalMultiSignal 既是槽又是信号。它将来自不同信号的触发收集为一个槽并像单个信号一样工作。

Architecture

如何使用?

  1. 定义一个 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();
  }
}
  1. 定义一个 Slot 实现。
class MySlot extends Slot<int> {
  MySlot() : super();

  [@override](/user/override)
  void onValue(int value) {
    // 执行某些操作
  }
}

在 Flutter 中,你可以创建本身就是槽的状态。你可以使用 aSignal.builder()SlotWidget

  1. Slot 添加到 Signal
void f() {
  // 将 Slot 添加到 Signal
  signal.addSlot(MySlot());
}

特殊信号类

如果你想要在列表和映射上触发更改,你不需要使用 value = newList 这样的表达式。这种语句会显著降低性能。

你可以使用 SignalListSignalMap 代替。SignalListSignalMap 在更改集合内容时会触发信号。

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

1 回复

更多关于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}');
}
回到顶部