Men的博客

欢迎光临!

0%

深入理解flutter

android风格和iOS风格的UI
widgets
rendering
animation
painting
gestures
foundation
skia — dart —— text
跨平台应用的框架,没有使用WebView或者系统平台自带的控件,使用自身的高性能渲染引擎(Skia)自绘,

widget树的概念

widget只是一个配置数据结构,创建是非常轻量的,加上flutter团队对widget的创建/销毁做了优化,不用担心整个widget树重新创建所带来的性能问题,但是renderobject就不一样了,renderobject涉及到layout、paint等复杂操作,是一个真正渲染的view,整个view 树重新创建开销就比较大,所以答案是否定的。

树的更新规则
找到widget对应的element节点,设置element为dirty,触发drawframe, drawframe会调用element的performRebuild()进行树重建
widget.build() == null, deactive element.child,删除子树,流程结束
element.child.widget == NULL, mount 的新子树,流程结束
element.child.widget == widget.build() 无需重建,否则进入流程5
Widget.canUpdate(element.child.widget, newWidget) == true,更新child的slot,element.child.update(newWidget)(如果child还有子节点,则递归上面的流程进行子树更新),流程结束,否则转6
Widget.canUpdate(element.child.widget, newWidget) != true(widget的classtype 或者 key 不相等),deactivew element.child,mount 新子树

数据从根往下传数据,常规做法是一层层往下,当深度变大,数据的传输变的困难,flutter提供InheritedWidget用于子节点向祖先节点获取数据的机制
子节点状态变更,向上上报通过发送通知的方式

Flutter建议复杂的image渲染使用RepaintBoundary,image的渲染需要io操作,然后解码,最后渲染,使用RepaintBoundary可以进行gpu的缓存,但是不一定就会缓存,engine会判断这个image是否足够复杂,毕竟gpu缓存还是非常珍贵的,同时RepaintBoundary还会对一些反复渲染的layer进行缓存处理(反复渲染3次及以上,这个是flutter的视频中提到的)

和iOS应用很像,在Dart的线程中也存在事件循环和消息队列的概念,但在Dart中线程叫做isolate。应用程序启动后,开始执行main函数并运行main isolate。
每个isolate包含一个事件循环以及两个事件队列,event loop事件循环,以及event queue和microtask queue事件队列,event和microtask队列有点类似iOS的source0和source1。

event queue:负责处理I/O事件、绘制事件、手势事件、接收其他isolate消息等外部事件。
microtask queue:可以自己向isolate内部添加事件,事件的优先级比event queue高。
这两个队列也是有优先级的,当isolate开始执行后,会先处理microtask的事件,当microtask队列中没有事件后,才会处理event队列中的事件,并按照这个顺序反复执行。但需要注意的是,当执行microtask事件时,会阻塞event队列的事件执行,这样就会导致渲染、手势响应等event事件响应延时。为了保证渲染和手势响应,应该尽量将耗时操作放在event队列中。

其中gen_snapshot是dart编译器,采用了tree shaking(类似依赖树逻辑,可生成最小包,也因而在Flutter中禁止了dart支持的反射特性)等技术,用于生成汇编形式的机器代码,再通过xcrun等编译工具链生成最终的App.framework。换句话说,所有的dart代码,包括业务代码,三方package代码,它们所依赖的flutter框架代码,最终将会变成App.framework。

在Flutter与Native混合开发的模式下,Platform Channel的应用场景非常多,理解Platform Channel的工作原理,有助于我们在从事这方面开发时能做到得心应手。

Platform Task Runner

UI Task Runner Thread(Dart Runner)

GPU Task Runner

IO Task Runner

每一个Engine实例都为UI,GPU,IO,Platform Runner创建各自新的线程。

如上图,Redux 的主要由三部分组成:Store 、Action 、 Reducer 。
Action ⽤于定义⼀个数据变化的请求⾏为。
Reducer ⽤于根据 Action 产⽣新状态,⼀般是⼀个⽅法。
Store ⽤于存储和管理 state。

Widget :就是我们平常写的控件, Flutter 宇宙中万物皆 Widget ,它们 都是不可变⼀帧,同时也是被⼈吐槽很多的嵌套模式,当然换个⻆度,事实上 你把他当作 Widget 配置⽂件来写或者就好理解了。
Element :它是 BuildContext 的实现类, Widget 实现跨帧保存的 state
就是存放在这⾥,同时它也充当了 Widget 和 RenderObject 之间的桥梁。
RenderObject :它才是真正⼲活(layout、paint)等,同时它才是真实的
“dom” 。
Layer :⼀整块的重绘区域(isRepaintBoundary),决定重绘的影响区域。

https://www.jianshu.com/p/97b745368826
https://www.jianshu.com/p/60a41d787191

马太瑞奥
考普廷闹