Dart版zxing库

年初逛github的时候看到zxing库,多年前曾用过as3版做了个二维码识别的小工具。目前由于web端不再支持flash,也就没用了。刚好最近在flutter上比较痴迷,就想着如果能翻译一套dart包出来,也是不错的。当时试着翻译了一下,还是有不少问题,忙别的事情便搁置了。

前段时间翻了下dartpud,看到上面有一个zxing的翻译,只做了qrcode的部分便想着自己翻译一下,顺便加深一下dart方面的知识。

zxing-dart

从Java到Dart ,比较麻烦的几个处理点

1. Dart 2.12 起启用了nullsafety

这也是当前的趋势,可以把大部分运行时错误消除在编码时。

具体来讲,就是定义变量类型时,直接指定该类型能不能为null,未指定可为null的类型,是不能留空或者赋值为null的

这就需要对大部分变量在初始化时直接赋值 ,或者标记为late


可为null的变量类型在使用时,需要先判断是否为null,或者使用强制调用 (!)


2. 数组定义及使用区别

数组方面除了类型表示方式不同,初始化也有很大区别

Java中一般初始化的时候指定数组的长度,在Dart中要么初始化为空,要么使用List.filled或generate来初始化,好处就是不用再遍历数组进行初始化赋值了。

另外,byte类型的数组可以直接对应 Uint8List

System.arraycopy  可以转为 List.copyRange 参数顺序必须调过来 ( 1,2位和3,4位互换 ),另外最后一个参数是位置,需要算上起始位(Java中拷贝长度)

3. 构造函数的区别以及final类型的属性

Java中构造函数都是同一个名字,并且可以重载。

dart则只能通过默认参数和不同名称的构造函数来翻译。大部分情况可以通过默认参数的设置处理到。

标记为final的属性,必须在构造函数的参数或初始化列表中赋值(非构造函数中)

class.png

这里选中的部分代码,就叫初始化列表,在初始化列表中,赋值语句的右边是不能用this的。

参数中赋值直接在参数中写 this.x, this.y。

标记为late,可以暂时不赋值,使用前自行确保赋值就可以了。

如果构造函数没有函数体,在定义括号后或者初始化列表后直接以分号(;)结束 


这就导致一部分属性在java中是构造函数中初始化的,初始化过程比较复杂,就不太好改写到参数或初始化列表中,不过大部分还是可以的,写法上更简洁了

4. 类属性及方法的访问修饰符

Java中类属性和方法,区分public, protected和private

dart中不支持直接设置修饰符,可以区分public和private 两种类型,private需要以下划线开头来设置属性或方法名,

final类型属性,只支持get, 不支持set

5. Java中的char类型

char在dart中没有对应类型,java中char比较灵活,可以当字符,可以当数字,dart中需要根据情况设置为int或string,进行拼接或比较时注意类型

6. Java中的枚举

Java中枚举定义可以直接定义枚举名,也可以带上参数

Dart中只支持名称定义,枚举类型有values静态属性,可以获取全部枚举值,每个枚举值有一个index属性,是定义时的顺序序号。

如果需要更复杂的数据处理,可以定义为静态类,再用static const 方式生成枚举值


7. 编码字符集

这一部分目前没有完全解决,java中默认支持比较多的字符集

dart内置了ascii, utf8和latin1,其它的只能通过扩展方式支持,处理起来也比较麻烦