业务场景:
收集集团人员的签名用于之后各种业务场景的签名
思路:
-
刚开始的时候准备用H5写个CANVAS画板,点击客户端 签名 按钮跳转内嵌H5页面或者唤醒移动端默认浏览器打开网页 问题在于H5的下载图片(a 链接 下载, 教程网上都有)到本地在客户端兼容性太低(整个市场只有360浏览器可以下载)。
-
用flutter直接写签名。
本文着重介绍 flutter 使用
实现:
插件介绍:
- signature (签名插件,源码和canvas画板差不多)
- image_gallery_saver (将图片的byte流保存到本地生成png格式)
额外提一句 flutter插件地址 类似 npm.org
代码实现
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:signature/signature.dart';
class Autograph extends StatefulWidget {
@override
_AutographState createState() => _AutographState();
}
class _AutographState extends State<Autograph> {
var _signatureCanvas = Signature(
height: 300,
backgroundColor: Colors.lightBlueAccent,
);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(
builder: (context) => Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
//SIGNATURE CANVAS
_signatureCanvas,
//OK AND CLEAR BUTTONS
Container(
decoration: const BoxDecoration(
color: Colors.black,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
//SHOW EXPORTED IMAGE IN NEW ROUTE
IconButton(
icon: const Icon(Icons.check),
color: Colors.blue,
onPressed: () async {
if (_signatureCanvas.isNotEmpty) {
// 拿到canvas地址的bytes地址 格式是Uint8List
var data = await _signatureCanvas.exportBytes();
// 这个byte流拿到你可以用Image.memory(data)直接渲染成图片
// 写入本地
final result = await ImageGallerySaver.saveImage(data);
if (result != '') {
Utils.showToast('文件已经保存到本地');
Navigator.of(context).pop();
}
}
},
),
//CLEAR CANVAS
IconButton(
icon: const Icon(Icons.clear),
color: Colors.blue,
onPressed: () {
setState(() {
return _signatureCanvas.clear();
});
},
),
],
)),
],
),
),
),
);
}
}
代码小结
代码也是网上搜的代码关键字: flutter手动签名并保存/等等 但是真的拿到的时候也不对。少了业务逻辑,当你将signature画布拿到文本流的那一刻完全不知道如何处理。
业务场景是希望所有的图片上传到服务,众所周知我们上传的时候流的格式是formdata,我并不能将流封装成formdata,只能考虑到将流保存到本地,如若有大佬对此业务熟知望赐教。
短短的一行代码 写入本地的代码考虑了很久。对于文件流的各种处理总是不合人意。
总结下
并不是完全的客户端开发,对于flutter 和 dart 了解的也不是很深刻,但是文件流上传下载代码逻辑都是相同(思路很重要),计算机或者说客户端的底层实现都是如此,给入行的小朋友得忠告就是 计算机原理一定要学习好。