就我的理解而言,FlatViewManager会将其所有子节点本身作为一个名为FlatViewGroup的视图。但后来我发现RCTTextManager将RCTText作为其影子节点返回,而RCTText不是虚拟节点。那么RCTTextManager会将FlatViewGroup作为viewInstance返回吗? FlatViewGroup中是否会有视图层次结构?我不确定 flat 的含义是什么。
答案 0 :(得分:4)
您的理解是正确的,但有些东西是您遗失的。
FlatViewGroup不会自己做或绘制任何东西。您可以注意到每个View实际上都是FlatViewGroup(Text,Image,View - 所有内容都映射到FlatViewGroup)。
但是,通用FlatViewGroup如何绘制图像,文本,边框等?事情是,它并不了解其中任何一个。
它的工作方式,视图,图像和文本在后台线程中准备内容,优化它并尝试尽可能少地使用资源(Android视图)。在许多情况下,它可以将数百个元素放入一个FlatViewGroup中。
但在某些情况下,更多视图更好。例如,它有一个你变异的元素,最好将该元素移出到它自己的View中,这样当该元素发生变化时,我们只能重绘该元素。
每个FlatShadowNode calles mMountsToView都有一个标志,用于控制我们是否可以将元素展平为父元素。
因此,当FlatShadowNode确实将mMountsToView标志设置为true时,我们应该使用哪个View?好吧,这是ViewManager.createViewInstance()开始的地方。
现在我可以回答你的问题。是的,RCTViewManager将为RCTText返回FlatViewGroup,但不会为每个 RCTText返回。大多数文本都将mMountsToView设置为false,从而将其展平为父级。
您感到困惑的是虚拟节点与视图的安装。
虚拟节点是一个Flexbox的东西,它意味着该节点不是一个独立的节点,并且无法测量。这具有副作用,即它始终与父非虚拟节点合并。这与Flat实现无关。
Flat UI Manager将节点展平提升到一个全新的水平。它添加了这个mMountsToView标志,用于控制节点是否会进一步变平。如果节点突变很多并且导致其兄弟节点无缘无故地重绘,则将其设置为true。
为了帮助您了解更多,想象您想要优化RCTText。您注意到它有时会挂载到FlatViewGroup,但由于它不能包含任何子节点,因此它不必是ViewGroup。您可以添加FlatView(甚至更专业的东西,如FlatTextView),将FlatViewGroup的内容复制到其中,删除所有子管理逻辑,修改RCTTextManager以返回您的View,它将起作用。如果重新运行React,您会注意到某些文本现在正在使用您的新视图,但只有那些将mMountsToView标志设置为true的文本(您可以通过将文本不透明度设置为0.99来触发它)。其余的将被展平为父级,可能仍然使用FlatViewGroup。
希望有所帮助。