当我们在两个使用identical()构造函数创建的小部件上调用const时,它返回false。然而,在对两个非小部件对象调用相同的同时,它返回true。
那是为什么?
void main() {
final a = const Center(
child: const Padding(padding: const EdgeInsets.all(8),)
);
final b = const Center(
child: const Padding(padding: const EdgeInsets.all(8),)
);
assert(identical(a, b)); // false
var a1 = const EdgeInsets.all(8);
var b1 = const EdgeInsets.all(8);
assert(identical(a1, b1)); // true
}错误:flutter/lib/ui/ui_dart_state.cc(199)未处理的异常:‘package:todo_精进/main.dart’:失败断言:第17行pos 8:“完全相同(a,b)”:不是真。
发布于 2021-06-09 04:20:07
经过大量的研究,这是我发现的。
现在,第一种和第二种情况之间的一个主要区别是,在第一种情况下,a和b是Widgets,而在第二种情况下,它们不是。
现在,flutter有一个--track-widget-creation标志,默认情况下在调试模式中启用它。
这是导致您看似const小部件非identical的主要罪魁祸首。
这意味着,当您在发布模式下运行应用程序时,您的小部件实际上将是compile time constants,因此identical函数将返回true。
将代码更改为(因为在发布模式中忽略断言调用)
final a = const Center(
child: const Padding(padding: const EdgeInsets.all(8),)
);
final b = const Center(
child: const Padding(padding: const EdgeInsets.all(8),)
);
print(identical(a, b));然后尝试使用release模式使用flutter run --release运行您的代码,并检查您的控制台以确保true将被打印出来。如果使用flutter run在调试中运行,您将在控制台中看到false。
有关更多信息,请参阅此线程。
https://stackoverflow.com/questions/67896851
复制相似问题