FlatViewManager 在 React Native android 中的作用是什么?

What is the purpose of FlatViewManager in react native android?

据我了解,FlatViewManager 会将其所有子项和自身扁平化为一个名为 FlatViewGroup 的视图。但是后来我发现 RCTTextManager return RCTText 是它的影子节点,而 RCTText 不是虚拟节点。那么RCTTextManager会returnFlatViewGroup作为它的viewInstance吗? FlatViewGroup 中是否会有视图层次结构?我不确定 flat 是什么意思。

你的理解是正确的,但是你还漏了一些东西。

FlatViewGroup 本身不执行或绘制任何内容。您会注意到每个视图实际上都是一个 FlatViewGroup(文本、图像、视图——所有内容都映射到一个 FlatViewGroup)。

但是一个通用的 FlatViewGroup 如何绘制图像、文本、边框等等?问题是,它对此一无所知。

它的工作方式,视图、图像和文本在后台线程中准备内容,对其进行优化并尝试使用尽可能少的资源(Android 视图)。在许多情况下,它可以将数百个元素放入一个 FlatViewGroup 中。

但在某些情况下,观看次数越多越好。例如,如果有一个元素发生了很多变化,最好将该元素移出到它自己的 View 中,这样当该元素发生变化时,我们只能重绘该元素。

在每个 FlatShadowNode 调用 mMountsToView 时都有一个标志,用于控制我们是否可以将元素展平为父元素。

那么当 FlatShadowNode 确实将 mMountsToView 标志设置为 true 时,我们应该使用哪个 View?那么,这就是 ViewManager.createViewInstance() 发挥作用的地方。

现在我可以回答你的问题了。是的,RCTViewManager 将为一个 RCTText return FlatViewGroup,但不会为 every 个 RCTText。大多数文本会将 mMountsToView 设置为 false,从而将其展平为父级。

您感到困惑的地方是虚拟节点 vs 挂载到视图。

虚拟节点是Flexbox的东西,就是说节点不是一个独立的节点,无法测量。这有一个副作用,它总是与父非虚拟节点合并。这与 Flat 实现无关。

Flat UI 管理器将节点扁平化提升到一个全新的水平。它添加了这个 mMountsToView 标志来控制节点是否会进一步展平。如果节点发生大量变异并导致其兄弟节点无故重绘,则将其设置为 true。

为了帮助您多了解一点,假设您想优化 RCTText。您注意到它有时会挂载到 FlatViewGroup,但由于它不能包含任何子项,因此它不必是 ViewGroup。您可以添加一个 FlatView(或什至更专业的东西,如 FlatTextView),将 FlatViewGroup 的内容复制到其中,删除所有子管理逻辑,将 RCTTextManager 修改为 return 您的视图,它会起作用。如果你重新运行你的 React,你会注意到一些文本现在正在使用你的新视图,但只有那些将 mMountsToView 标志设置为 true 的视图(你可以通过例如将文本不透明度设置为 0.99 来触发它)。其余的将被展平到可能仍在使用 FlatViewGroup 的父级中。

希望对您有所帮助。