Flutter 学习之旅03 构造方法、Isolate 、拓展方法


构造方法

Dart 可以按照需求自定义构造方法,学习构造方法正好把前面学到的 类 属性 方法 私有变量 结合运用一下,

例子

img

虽然只是短短的20多行代码,但是它还是有挺多知识点的这里梳理一下

1.私有变量或者方法是以 _(下划线开始的) 他不能被方位,如果想要获取和修改需要添加set 和get 方法, get方法 直接返回value 可以简写

2.普通的构造方法有且只能有一个

3.按照需求自己命名的构造方法

4.方法非必要参数使用,和简写 并与私有变量set 结合使用

Isolate

通过简介和浏览网页我大概知道了一些情况,感觉理解的很不到位,为办法的事情,都是自己学的,有什么不懂得东西我相信再接下来的学习过程中会明白的,在这里只要明白Dart 是单线程的 使用isolate 可以实现类似多线程的数据通信,在网上有一个比较官方的解释:因为在Dart中线程不会共享内存,所以也不存在死锁,从而也导致了Isolate之间的数据只能通过port的端口方式发送接口,所以Isolate也称为隔离的执行. 按照我的理解就是 一个isolate 不能访问另一个isolate的变量,也就是两个isolate不能共享局部变量

自己的东西只能自己访问,如果想要共享,只能使用port 发送和接收消息

这里写一个最简单的Isolate 例子,然后再根据自身的理解稍微完善一下,

由于isolate 的入参里面含有一个方法参数,但是我的androidstudio 4.0 传入方法的写法和 我看到的文章不同,我还重新看了一下传递方法的入参的写法,

例子

img

首先定义两个 方法,one 方法 入参String 返回String two 入参String void

再定义一个addMethod 两个参数就是按照上面那两个方法定制的,

使用addMethod 的时候有两种写法

img

结果

img

可以看到 第二种写法的结果上出现的是 tsm1 这种就是在入口修改参数的方法,感觉还是这种写法比较靠谱

isolate

img

最简单的Isolate 创建模式,

这里面一个新的知识点 async 和 await 字面上的意思 async 异步 await 等一等

这就比较好理解了,async 就是标识这个 方法开启了异步耗时工作,await 就是执行到这里了的等一下结果,再向下执行

在出现 await 关键字时必须要出现 async 关键字,

这里我先不增加 async 与 await 这两个关键字 打印一下结果

img

未增加 await 关键字结果

这里是先执行的主的isolate的打印,再执行新创建的isolate的打印

这里我再把await 加上打印一下日子

img

增加了 await 的结果

这样就看出来如果增加了await 就是需要先执行 新的isolate中的方法,如果未增加就是按照main方法里面的顺序执行,感觉这里的执行速度应该是创建新的isolate需要花费一定的时间,到时 main方法先结束,

下面我们想要从新的isolate中回调信息,使用到上面我们说的那个port 的方法

例子

img

想要接受回调 就必须将钩子传入 新的isolate中,这个钩子是从ReceivePort 中获取的SendPort,类似java中的回调, 只给回传消息的部分就可以了

下面我们继续修改 subTask 让他的入参从原来的String 到 SendPort ,SendPort 让新的isolate 具备了发送了消息的能力

这里面我让显得isolate 等待了5秒,再发送消息

同时为了得到消息我们还未ReceivePort 添加了一个监听器,每次有消息回调的时候都会打印日志,

结果

img

监听第一条数据可以使用port.first

监听每一条数据也可以使用、

port.forEach((element) {printString(element);}); 这个方法 等同于 port.listen((message) {printString(‘listen: $message’);});

img

异步现在就学习了这么写,类似java中最简单的newThread 的使用,关于类似线程池的使用方法,个人觉得应该放在后面,

还有Zone 的概念看的也是模模糊糊,我觉得也是应该在更输入的了解了flutter之后再去看这种理论知识,这里也先放一放

拓展方法

伴随着Flutter 1.12而来的Dart 2.7还支持拓展方法,它使用户可以向任何类型(甚至是无法控制的类型)添加新功能,并具有常规方法调用的简洁性和自动完成性

例子

img

这个里面我试了一下增加一个他的属性, 也试了增加他一个方法,这两种的解决方法都差不多,具体怎么用看自己,

使用

img