flutter如何异步?
sync* 同步生成器
yield 返回该值,并且继续等待
Isolate
每个线程都有自己的Isolate和它自己的内存
每个Isolate互相隔离
Isolate的内存分配和垃圾回收,不需要锁定,他只有一个线程
运行一个事件队列,取最旧的事件
case: (一个页面,有个button,请求网络) 点击button->进入事件处理队列->
streams:告诉flutter,这些代码稍后运行
总结:
dart是单线程运行,有俩个队列,微队列,任务队列,isolate会开启一个轮询,不停的消费数据
没有数据,休息会,喝点茶
有数据,执行任务
单线程确定了他,同时只能干一件事情,如果遇到耗时的一些操作,可以通过开辟新的isolate来完成,但是需要注意,isolate之间的通信
三种通道的区别?
BasicMessageChannel:用于传递字符串和半结构化的信息,持续通信,收到消息后可以回复此次消息,如:Native将遍历到的文件信息陆续传递到Dart,在比如:Flutter将从服务端陆陆续获取到信息交个Native加工,Native处理完返回等
用于传递方法调用(method invocation)一次性通信, 用的比较频繁,一般是原生赋能给flutter
EventChannel: 用于数据流(event streams)的通信,持续通信,收到消息后无法回复此次消息,通常用于Native向Dart的通信,如:手机电量变化,网络连接变化,陀螺仪,传感器等
mixin的作用?
可以把它想象为Kotlin中的接口
多个mixin可以相互覆盖以实现组合
如果mixin存在冲突的部分,后面会覆盖前面的
mixin 是Dart 2.1 加入的特性,以前版本通常使用abstract class代替。简单来说,mixin是为了解决继承方面的问题而引入的机制,Dart为了支持多重继承,引入了mixin关键字,它最大的特殊处在于:mixin定义的类不能有构造方法,这样可以避免继承多个类而产生的父类构造方法冲突
widget element renderobject联系?
理解
widget其实没做啥,就是一个壳子,有点类似一个代理,方便开发者调用,widget持有一个element, element持有一个renderobject,element像是一个桥梁,连接widget和renderobject,renderobject是真正负责渲染的
生命周期?
事件处理?
如何自定义组件?
stream?
用于接收异步事件数据
和Future 不同的是,它可以接收多个异步操作的结果
它常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等
使用 Stream API 中的 listen() 方法和 await for 关键字来处理一个 Stream
Stream 有两种类型:Single-Subscription 和 Broadcast
通常情况下streams被设置为单次订阅,整个生命周期只允许有一个listener
广播的方式允许有多个订阅,普通的不可以
这个讲的很清楚: https://www.youtube.com/watch?v=nQBpOIHE4eE
个人理解:
streams是处理多个异步,future是处理单个异步
streams有点类似rxjava 或者kotlin flatMap高阶操作,用流的形式处理数据
flutter里面的应用就是streambuilder,接受一个sream
streams适合处理多任务,比如feed流列表,需要多个网络接口拼接返回,streams非常适合
对文件的操作可以用streams
stream有俩种类型,单次订阅,还有就是广播的方式,有没有接受不重要
await & async
yield
App架构
-
目标1:将核心业务逻辑与 UI、数据库、网络和第三方包分开。为什么?核心业务逻辑不会频繁更改,而所有其他逻辑则经常更改
-
目标2:充分的解耦 UI层不应该直接调用网络,或者数据库,底层的改动上层做到无感知。需要一个中间层
-
引入provider-状态管理助手
用的场景: prodiver用的多么?
答:比较多,涉及到数据需要共享的时候,比如同步用户信息这个场景,需要信息可能要显示到app的不同页面,如果没引入proivder之前,我是每一个页面注册一个userinfo update的监听,比较麻烦,有了provider,我目前采用的是,启动的主页面,外边包一个proivder,一旦有数据变化,其他使用的地方直接就改变了,省事好多
暴露一个共享model出来 比如userInfoData
ChangeNotifierProxyProvider
还有一些启动app时候的一些异步操作,我觉得都可以使用provider
ImageProvider
加载图片数据并进行缓存、解码
读懂源码之Widget-Element-RenderObject
根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最后再通过RenderObject来完成布局排列和绘制
Element就是Widget在UI树具体位置的一个实例化对象
Element树根据Widget树生成,而渲染树又依赖于Element树