我有一个无状态小部件
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团队在重建小部件树时阐明“相同”还是“相等”还是“相同”。
答案 0 :(得分:-1)
您想知道是否要在小部件树的不同部分中创建2个Foo()实例,并重写==来确保build()仅被调用一次?即使您有2个单独的对象? 我完全怀疑……尽管,我们知道Flutter为所有const实例优化了小部件树, 如果某些父窗口小部件自行重建,则不会重建const Stateless窗口小部件子级。