Flutter 复习总结

近期准备面试 好好复习下 总结点东西

Widget
Widget是不可变的.
Widget 是 描述 Element的配置 , 告诉 Element 这个实例如何去渲染。
Widget 和 Element 之间是一对多的关系 .
每当Widget插入到树中,就会生成一个对应的Element.
Widget 可能被复用到树的多个部分,对应产生多个 Element 对象。

RenderObject
RenderObject是渲染树中的对象,所以它才是实际的渲染对象
RenderObject 涉及到布局、计算、绘制等流程

Element
在树中的特定位置实例化[Widget]。
Element 持有 RenderObject 和 Widget。
Element充当Widget和RenderObject的桥梁, State 就是保存在 Element 中。
Flutter 中的 BuildContext 只是接口,而 Element 实现了它。

配置文件 Widget 生成了 Element,而后创建 RenderObject 关联到 Element 的内部 renderObject 对象上,最后Flutter 通过 RenderObject
数据来布局和绘制。

Flutter 中默认主要通过 runtimeType 和 key 判断更新

在 newWidget 与oldWidget 的 runtimeType 和 key 相等时会选择使用 newWidget 去更新已经存在的 Element 对象,不然就选择重新创建新的 Element。

Widget 重新创建,Element 树和 RenderObject 树并不会完全重新创建

Flutter 中的 Dart 的线程是以事件循环和消息队列的形式存在,包含两个任务队列,一个是 microtask 内部队列,一个是 event 外部队列,而 microtask 的优先级又高于 event 。

因为 microtask 的优先级又高于 event, 同时会阻塞event 队列,所以如果 microtask 太多就可能会对触摸、绘制等外部事件造成阻塞卡顿哦。

Flutter 中存在四大线程,分别为 UI Runner、GPU Runner、IO Runner, Platform Runner(原生主线程) ,同时在 Flutter 中可以通过 isolate 或者 compute 执行真正的跨线程异步操作。

Flutter 的 Debug 下是 JIT 模式,release下是AOT模式。

Flutter 中可以通过 mixins AutomaticKeepAliveClientMixin ,然后重写 wantKeepAlive 保持住页面,记得在被保持住的页面 build 中调用 super.build 。(因为 mixins 特性)。

Platform Channel
Flutter 中可以通过 Platform Channel 让 Dart 代码和原生代码通信的:
BasicMessageChannel :用于传递字符串和半结构化的信息。
MethodChannel :用于传递方法调用(method invocation)。
EventChanne l: 用于数据流(event streams)的通信。

问题 1 :setState是立即生效的吗?

答: 不是.
Flutter 中 setState 其实是调用了 markNeedsBuild ,该方法内部标记此Element 为 Dirty ,然后在下一帧 WidgetsBinding.drawFrame 才会被绘制,这可以看出 setState 并不是立即生效的。

猜你喜欢

转载自blog.csdn.net/u011272795/article/details/106826648