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

时间:2019-08-16 19:23:54

标签: flutter

我有一个无状态小部件

class Foo extends StatelessWidget {
  final String text;
  A(this.text);
  Widget build(BuildContext _) => Text(text);
}

假设我在窗口小部件树中的某个地方创建了“ Foo”的实例,并(很少)更改了“文本”。当然,每当我创建一个新的“ Foo”实例时,即使它具有相同的“文本”,也会调用它的“构建”。

是否会引入用于检查“文本”的“ operator ==”以避免重建?

编辑:窗口小部件树中仅放置一个“ Foo”实例,但它始终是每个父版本的新实例。

编辑:

我想我在Flutter代码库中的“ framework.dart”中找到了该位置:

if (child.widget == newWidget) {
    if (child.slot != newSlot)
      updateSlotForChild(child, newSlot);
    return child;
  }

因此,如果Widget覆盖了'operator ==',则相同Widget类的两个等于'equal'的实例将不会将子树标记为脏,因此不会触发子树'build'。

因此,覆盖‘operator ==’可以帮助优化性能!

有人可以确认吗?

编辑:

我在GitHub上打开了一张票,请Flutter团队在重建小部件树时阐明“相同”还是“相等”还是“相同”。

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

1 个答案:

答案 0 :(得分:-1)

您想知道是否要在小部件树的不同部分中创建2个Foo()实例,并重写==来确保build()仅被调用一次?即使您有2个单独的对象? 我完全怀疑……尽管,我们知道Flutter为所有const实例优化了小部件树, 如果某些父窗口小部件自行重建,则不会重建const Stateless窗口小部件子级。