美文网首页
Flutter中的Element(上篇)

Flutter中的Element(上篇)

作者: 沐灵洛 | 来源:发表于2020-08-05 17:38 被阅读0次

Element是什么?

Widget在树中特定位置的实例。文档中的描述:

An instantiation of a [Widget] at a particular location in the tree.

widgets描述如何配置一个子树,但是相同的widget可以同时被用来配置多个子树,这是因为widget是不可变的。一个Element表示在树中的特定位置对Widget配置数据的使用。随着时间的推移,Element关联的widget可能会变化。比如:如果此位置的widget的父widget重新构建了,并且在此位置重新创建了一个新的widget时。

树中的Elements:大多数的elementschild都是独一无二的,但是有一些widgets关联的element可以有多个children,比如RenderObjectElement的子类MultiChildRenderObjectElement

Element的生命周期

  • framework通过在将要被用来作为element的初始配置的widget上调用[Widget.createElement]创建一个element

  • framework通过调用[mount]将一个新创建的element加入树中给定的父节点的插槽下面。[mount]方法负责注入任何的child widgets并且在有需要的时候,会调用[attachRenderObject]将关联的render objects 添加到渲染树render tree中。
    到这一步的时候element,会进入active状态,并且会显示在屏幕上。

  • 某些时候,父节点可能决定要改变使用在子element上的配置(widget)时。比如:父节点因为一个新的state重新build,(每次build都会产生一个新的widgetframework将使用新widget调用[update]方法,这个新的widget将总是拥有和旧widget同样的runtimeTypeKey。如果父节点希望改变树中此位置的新widget对应的runtimeTypeKey时,会unmount旧的element并且在此位置注入一个新的widget,(mean:使用新的widget创建一个新的element放在此位置)。

  • 还有一些时候呢,树中的祖先节点(或者中间的祖先),想要移除树中的某个element,该怎么办呢?祖先节点自己调用[deactivateChild]
    [deactivateChild]后会发生什么事情呢?祖先将从render tree中遍历移除elements对应的render objects,并且将这个元素加入到owner对应的不活跃的数组中,最终导致framework对此element调用[deactivate]方法。

关于ownerBuildOwner类型的,它widgets framework的管理类
用于跟踪哪些widgets需要rebuild,并且处理一些适用于整个widget tree的其他任务。

  • 这个时候呢,element会进入inactive状态,并且不会出现在屏幕上。
    一个element可以保持inactive状态直到当前的动画帧结束。在动画帧结束的时候,所有处于inactiveelements将会被unmounted(即:调用[unmount]方法)。
  • 但是,当处于inactive状态的元素被重新合并到树中时(比如:它或它的祖先有能重用的global key时),framework将从ownerinactive elements数组中移除这个element,并且为此element调用[activate],同时 reattachelementrender objectrender tree中。这时候呢,这个element将 再次变为active状态,并且可能出现字屏幕上。
  • 当处于inactive状态的elements,在当前动画帧结束的时候并没有被重新合并到树中时,framework将为每个elements调用[unmount]方法。
  • 到这时,element会变为defunct,并且以后将再也无法合并到树中(即宣告,element顽强而富有斗志的一生 end)。

Element的生命周期图解

Element的生命周期图解.png

下一篇我们将与大家一起探讨Element的一些重要的方法的作用以及调用时机。

相关文章

网友评论

      本文标题:Flutter中的Element(上篇)

      本文链接:https://www.haomeiwen.com/subject/dpkfrktx.html