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 的父级中。
希望对您有所帮助。
据我了解,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 的父级中。
希望对您有所帮助。