Flutter中的一些知识概念总结

在学习Flutter一段时间后,有一些概念性的东西,还是打算写下来,记录一下。

Widget、Element、RenderObject

大家都知道Widget、Element、RenderObject,每个部分负责相应的功能,我们只需要写Widget就行,为什么还需要Element和RenderObject呢,这是因为Flutter为了在大量Widget时保证良好的性能,不能一直删除创建新的对象,可以复用原来的对象,比如复用Element,然后只需要修改RenderObject的内容,这样就能够降低性能损耗,提高流畅性。
在这里插入图片描述

Flutter Engine

在新版本的Flutter API中,我们可以使用源码依赖的方式和原生混合开发,里面提到了可以预热一个Flutter Engine,然后Cache保存起来,后续都使用这个Flutter Engine来处理Flutter页面,这样可以避免创建多个Flutter Engine,降低内存消耗。

那么Flutter Engine是什么呢?

Flutter Engine由C++实现,负责以下功能:

  • 线程管理
  • Dart VM状态管理
  • Dart代码加载,加载的代码跑在各自独立的Isolate中

Dart VM

运行Dart代码的地方

Isolate

类似于Java中的线程,但是Isolate没有共享内存,相互之间通过Port来收发数据,所以也就不存在锁的问题。

Widget的更新机制

当有父Widget的配置数据改变时,同时其State.build返回的Widget结构与之前不同,此时就需要重新构建对应的Element树。为了进行Element复用,在Element重新构建前会先尝试是否可以复用旧树上相同位置的element,element节点在更新前都会调用其对应Widget的canUpdate方法,如果返回true,则复用旧Element,旧的Element会使用新Widget配置数据更新,反之则会创建一个新的Element。Widget.canUpdate主要是判断newWidget与oldWidget的runtimeType和key是否同时相等,如果同时相等就返回true,否则就会返回false。根据这个原理,当我们需要强制更新一个Widget时,可以通过指定不同的Key来避免复用。

发布了82 篇原创文章 · 获赞 86 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/unicorn97/article/details/105254356