重写运算符==是否有助于避免重建?

use*_*643 5 flutter

我有一个无状态小部件

\n\n
class Foo extends StatelessWidget {\n  final String text;\n  A(this.text);\n  Widget build(BuildContext _) => Text(text);\n}\n
Run 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\n
if (child.widget == newWidget) {\n    if (child.slot != newSlot)\n      updateSlotForChild(child, newSlot);\n    return child;\n  }\n
Run 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

https://github.com/flutter/flutter/issues/38740

\n

roi*_*ker 0

您想知道是否在小部件树的不同部分创建 2 个 Foo() 实例,并且重写 == 将确保 build() 仅被调用一次?即使你有 2 个独立的对象?我完全怀疑......尽管我们知道 Flutter 优化了所有 const 实例的 widget 树,但如果某些父 widget 自行重建,const Stateless widgets 子代将不会被重建。