Widget
是什么?
Widget
是描述UI元素Element
的配置数据;一个Widget
可以对应多个Element
,即:同一份配置,可生成多个Element
;每个Element
都会对应一个Widget
。
abstract class Widget extends DiagnosticableTree {
const Widget({ this.key });
final Key key;
@protected
Element createElement();
...
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
}
Key
控制一个widget
如何替换树中另一个widget
。如果两个widget
的runtimeType
与key
相同,则表示新的widget
将替换旧的widget
,并调用Element.update
更新Element
;否则旧的element
将从树中移出,新的element
插入树中。
另外,使用GlobalKey
作为widget
的key
时,允许element在树上移动(changing parent)不会丢失状态。当找到新的widget
的runtimeType
与key
与之前相同位置的widget
不一致,但是在前一帧树中的其他位置有个与旧widget
具有相同globalKey
的widget
,然后将该widget
的element
移动到新的位置。
createElement
给定的widget可以被包含在树中零次或多次。特别是给定的widget
可以被放置到树中多次。每次一个widget
被放置到树中时,都会注入到一个element
中,这意味着widget合并到树中多次也会被多次注入。
canUpdate
新旧两个widget的 runtimeType
与key
是否相同, 决定一个使用oldWidget
作为自己配置的element
,是否能够使用newWidget
更新它自己。如果两个widget
没有key
,则认为它们是匹配的,即使children
完全不相同。
具体的关于canUpdate
的处理逻辑,如下图。
Flutter中的Element(下篇)
Flutter中的Element(上篇)
iOS 解决 [NSURL fileURLWithPath:] 对 # 的编码问题
Xcode 调整导航目录字体大小b
Swift 5.1 (21) - 泛型
Swift 5.1 (20) - 协议
Swift 5.1 (19) - 扩展
Swift 5.1 (18) - 嵌套类型
Swift 5.1 (17) - 类型转换与模式匹配
浅谈编译过程
网友评论