Flutter 学习之旅(五) 构造方法、Isolate
构造方法
Dart 可以按照需求自定义构造方法,学习构造方法正好把前面学到的 类 属性 方法 私有变量 结合运用一下,
例子
![](https://img.haomeiwen.com/i11861448/df0acb53b6e87bd9.png)
虽然只是短短的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 传入方法的写法和 我看到的文章不同,我还重新看了一下传递方法的入参的写法,
例子
![](https://img.haomeiwen.com/i11861448/11018d20a17babc9.png)
首先定义两个 方法,one 方法 入参String 返回String two 入参String void
再定义一个addMethod 两个参数就是按照上面那两个方法定制的,
使用addMethod 的时候有两种写法
![](https://img.haomeiwen.com/i11861448/1ac96dbc7b196349.png)
结果
![](https://img.haomeiwen.com/i11861448/eb850da11b61faf7.png)
可以看到 第二种写法的结果上出现的是 tsm1 这种就是在入口修改参数的方法,感觉还是这种写法比较靠谱
isolate
![](https://img.haomeiwen.com/i11861448/67c72f9b877b9475.png)
最简单的Isolate 创建模式,
这里面一个新的知识点 async 和 await 字面上的意思 async 异步 await 等一等
这就比较好理解了,async 就是标识这个 方法开启了异步耗时工作,await 就是执行到这里了的等一下结果,再向下执行
在出现 await 关键字时必须要出现 async 关键字,
这里我先不增加 async 与 await 这两个关键字 打印一下结果
![](https://img.haomeiwen.com/i11861448/5e5ca97f0ef89219.png)
这里是先执行的主的isolate的打印,再执行新创建的isolate的打印
这里我再把await 加上打印一下日子
![](https://img.haomeiwen.com/i11861448/7dd60b8ce0883641.png)
这样就看出来如果增加了await 就是需要先执行 新的isolate中的方法,如果未增加就是按照main方法里面的顺序执行,感觉这里的执行速度应该是创建新的isolate需要花费一定的时间,到时 main方法先结束,
下面我们想要从新的isolate中回调信息,使用到上面我们说的那个port 的方法
例子
![](https://img.haomeiwen.com/i11861448/40f1077aceb74b9c.png)
想要接受回调 就必须将钩子传入 新的isolate中,这个钩子是从ReceivePort 中获取的SendPort,类似java中的回调, 只给回传消息的部分就可以了
下面我们继续修改 subTask 让他的入参从原来的String 到 SendPort ,SendPort 让新的isolate 具备了发送了消息的能力
这里面我让显得isolate 等待了5秒,再发送消息
同时为了得到消息我们还未ReceivePort 添加了一个监听器,每次有消息回调的时候都会打印日志,
结果
![](https://img.haomeiwen.com/i11861448/5e79be6a5e6358aa.png)
监听第一条数据可以使用port.first
监听每一条数据也可以使用、
port.forEach((element) {printString(element);}); 这个方法 等同于 port.listen((message) {printString('listen: $message');});
![](https://img.haomeiwen.com/i11861448/a6f459fac7ea82b9.png)
异步现在就学习了这么写,类似java中最简单的newThread 的使用,关于类似线程池的使用方法,个人觉得应该放在后面,
还有Zone 的概念看的也是模模糊糊,我觉得也是应该在更输入的了解了flutter之后再去看这种理论知识,这里也先放一放
拓展方法
伴随着Flutter 1.12而来的Dart 2.7还支持拓展方法,它使用户可以向任何类型(甚至是无法控制的类型)添加新功能,并具有常规方法调用的简洁性和自动完成性
例子
![](https://img.haomeiwen.com/i11861448/9aa63079bb9c88f7.png)
这个里面我试了一下增加一个他的属性, 也试了增加他一个方法,这两种的解决方法都差不多,具体怎么用看自己,
使用
![](https://img.haomeiwen.com/i11861448/556db98d80972667.png)
基础篇片尾语
到这里 Dart 语言基础就写完了,下一篇文件就开始学习控件了, 由于控件的属性非常杂乱,感觉不能像现在这种隔天更新一次的方式了,太扎心了 还是感觉自己的能力有限啊,但是我会继续更新的,虽然我也知道我现在写的这些东西对于没有Dart基础的小伙伴很不友好,但是我也是从这样过来的,没有哪个成功时不是通过努力得来的,我也是从这个阶段过来的,打算学习flutter 之前并没有从网上看什么文件,而是从flutter 中文网上面看了好久的基础语法,说实话从java变更到dart 说简单真的挺简单的,但是这里面也有很多东西被java固定了,慢慢适应吧,
我学习flutter的整个过程都记录在里面了
https://www.jianshu.com/c/36554cb4c804
最后附上demo 地址