【Flutter API】AbstractNode 翻译及个人理

2021-12-02  本文已影响0人  popesa

子类有: LayerRenderObjectSemanticsNode
AbstractNode 是 tree 中一个抽象节点。

AbstractNode有深度、连接、父级的概念,但是并不会指向子节点。

当子类修改child的parent,应该在适当时调用parent.adoptChild(child)或者parent.dropChild(child)。如果有需要,可以在子类中暴露用于操作tree的API。
当前节点的父节点通过属性parent来暴露。

当前的附着状态有attached属性来暴露。任何被认为是附着的树的根都应该通过调用attach来手动附加。除此之外,方法attach和detach不应该直接被调用;附着状态会自动的由adoptChild和dropChild方法来管理。

具有Children的子类必须重写这些方法的文档中所描述的attach和detach方法。

节点的depth(深度)总是比他们祖先大。不能保证兄弟姐妹之间的深度。节点的深度是为了保证节点按照深度顺序进行处理。子节点的深度可以比父节点的深度大一个以上;深度值从来不会降低:最重要的就是子节点的深度值比父节点的深度值大。

关于深度,考虑这样的一棵树,根节点为A,B为A的子节点,C为B的子节点,初始时A的深度值为0,B为1,C为2。如果把C变更成A的子节点,B的兄弟节点,则C的深度值不变,仍然为2。深度值会有adoptChild和dropChild方法来自动维护。

构造函数 AbstractNode()

属性

属性名 说明
attachedbool 此节点所在树的根节点是否连接到了某个东西上。
在调用attach后,为true;调用detach后为false。
depthint 节点在树中的深度。
从根往下,单调递增。
ownerObject? 节点的所有者,如果没有附着则为null。
当前节点所属的子树都有同样的所有者。
parentAbstractNode? 当前节点在数中的父节点



方法

方法签名 返回值类型 说明
adoptChild (covariant AbstractNode child) void 标记参数节点为当前节点的子节点。
当子类添加子节点时应该调用这个方法。
attach(covariant Object owner) void 将当前节点的owner标记为参数值。
通常只会在两种情况下调用,一是在父节点的attach方法中调用,二是由owner来调用,用以标注树的根节点为附着。
detach() void 子节点从父节点上脱离
dropChild (covariant AbstractNode child) void 移除子节点
redepthChild void
redepthChildren(AbstractNode child) void 空方法



======= 以上是对官方文档的翻译 ========


======= 不愧为官方文档,看完后,好多概念都不理解 ======
======= 阅读源码后才清晰一些,下面是我对部分疑惑的解释 ===========

属性attached,其实是个get方法,就是对属性owner做了判断,如果owner非空,则为true,如果owner为空,则为false。

对于方法,主要还是方法列表中的前四个方法,adoptChild、attach、detach和dropChild。他们可以分成两组,adoptChild和attach为添加节点时调用的,区别是adoptChild是在父节点上调用,attach是在子节点上调用;另外的两个方法detach和dropChild,就是在移除节点时,分别在子节点和节点上调用的。

=== 码字不易,求赞求打赏 === 你的支持是我坚持分享的动力 ===

上一篇 下一篇

猜你喜欢

热点阅读