【Flutter API】AbstractNode 翻译及个人理
子类有: Layer、 RenderObject 和 SemanticsNode
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()
属性
属性名 | 说明 |
---|---|
attached → bool | 此节点所在树的根节点是否连接到了某个东西上。 在调用attach后,为true;调用detach后为false。 |
depth → int | 节点在树中的深度。 从根往下,单调递增。 |
owner → Object? | 节点的所有者,如果没有附着则为null。 当前节点所属的子树都有同样的所有者。 |
parent → AbstractNode? | 当前节点在数中的父节点 |
方法
方法签名 | 返回值类型 | 说明 |
---|---|---|
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,就是在移除节点时,分别在子节点和节点上调用的。
=== 码字不易,求赞求打赏 === 你的支持是我坚持分享的动力 ===