Flutter中的Widget

2020-08-10  本文已影响0人  沐灵洛

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。如果两个widgetruntimeTypekey相同,则表示新的widget将替换旧的widget,并调用Element.update更新Element;否则旧的element将从树中移出,新的element插入树中。
另外,使用GlobalKey作为widgetkey时,允许element在树上移动(changing parent)不会丢失状态。当找到新的widgetruntimeTypekey与之前相同位置的widget不一致,但是在前一帧树中的其他位置有个与旧widget具有相同globalKeywidget,然后将该widgetelement移动到新的位置。

createElement

给定的widget可以被包含在树中零次或多次。特别是给定的widget可以被放置到树中多次。每次一个widget被放置到树中时,都会注入到一个element中,这意味着widget合并到树中多次也会被多次注入。

canUpdate

新旧两个widget的 runtimeTypekey是否相同, 决定一个使用oldWidget作为自己配置的element,是否能够使用newWidget更新它自己。如果两个widget没有key,则认为它们是匹配的,即使children 完全不相同。

具体的关于canUpdate的处理逻辑,如下图。

canUpdate调用逻辑.png
上一篇下一篇

猜你喜欢

热点阅读