我有一个无状态小部件
\n\nclass Foo extends StatelessWidget {\n final String text;\n A(this.text);\n Widget build(BuildContext _) => Text(text);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n让\xe2\x80\x99s 说我在小部件树中的某个位置创建了\xe2\x80\x98Foo\xe2\x80\x99 的实例,并且(很少)更改\xe2\x80\x98text\xe2\x80\x99。当然,每当我创建 \xe2\x80\x98Foo\xe2\x80\x99 的新实例时,即使它具有相同的 \xe2\x80\x98text\xe2\x80\x99,它的 \xe2\x80\x98build\xe2 \x80\x99 将被调用。
\n\n引入 \xe2\x80\x99operator==\xe2\x80\x98 来检查 \xe2\x80\x98text\xe2\x80\x99 是否会避免重建?
\n\n编辑:小部件树中仅放置了一个 \xe2\x80\x98Foo\xe2\x80\x99 实例,但它 \xe2\x80\x99 始终是每个父版本的新实例。
\n\n编辑:
\n\n我想我在 Flutter 代码库中找到了 \xe2\x80\x98framework.dart\xe2\x80\x99 中的位置:
\n\nif (child.widget == newWidget) {\n if (child.slot != newSlot)\n updateSlotForChild(child, newSlot);\n return child;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n因此,如果 Widget 覆盖 \xe2\x80\x98operator ==\xe2\x80\x98,则 \xe2\x80\x98equal\xe2\x80\x99 的同一 Widget 类的两个实例不会将子树标记为脏因此不会触发子树 \xe2\x80\x98build\xe2\x80\x99。
\n\n因此,覆盖 \xe2\x80\x98operator ==\xe2\x80\x98 可以帮助优化性能!
\n\n有人可以证实吗?
\n\n编辑:
\n\n我在 GitHub 上开了一张票,要求 Flutter 团队澄清关于重建 widget 树的“相同”、“相等”和“相同”。
\n\n\n您想知道是否在小部件树的不同部分创建 2 个 Foo() 实例,并且重写 == 将确保 build() 仅被调用一次?即使你有 2 个独立的对象?我完全怀疑......尽管我们知道 Flutter 优化了所有 const 实例的 widget 树,但如果某些父 widget 自行重建,const Stateless widgets 子代将不会被重建。
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |