Flutter 为什么Dart中的const小部件不相同?

Flutter 为什么Dart中的const小部件不相同?,flutter,dart,widget,constants,Flutter,Dart,Widget,Constants,当我们对使用const构造函数创建的两个小部件调用idential()时,它返回false。而在为两个非小部件对象调用相同的函数时,它返回true 为什么呢 void main() { final a = const Center( child: const Padding(padding: const EdgeInsets.all(8),) ); final b = const Center( child: const Padding(padding: cons

当我们对使用
const
构造函数创建的两个小部件调用
idential()
时,它返回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

}
[错误:flatter/lib/ui/ui\u dart\u state.cc(199)]未处理的异常:“包:todo\u改进/main.dart”:失败的断言:第17行位置8:“相同(a,b)”:不正确


经过大量研究,我发现了这一点

现在,第一种情况和第二种情况之间的一个主要区别是,在第一种情况下,a和b是
Widget
s,而在第二种情况下,它们不是

现在,flatter有一个
--track widget creation
标志,默认情况下在调试模式下启用该标志

这是使您的
const
小部件看起来不
相同的罪魁祸首

现在这意味着当你在发布模式下运行你的应用程序时,你的小部件将确实是编译时常量,因此
相同的
函数将确实返回true

将代码更改为(更改原因是在发布模式下忽略断言调用)

然后尝试使用
flatter run--release
release
模式下运行代码,并检查控制台以查看是否会打印
true
。如果使用
flatterrun
在调试中运行,您将在控制台中看到
false


有关更多信息,请参阅此部分。

我无法重现您描述的行为。请创建一个。抱歉。你能再检查一下吗。禁用2行:var a=常量边集。全部(8);var b=常数边集全部(8);你的代码没有改变。我无法复制。请创建一个。以下是错误:。对不起。@Owo这是否澄清了您的问题?非常感谢。!!!我不知道有这样的事。很高兴能帮上忙。一定要考虑接受这个答案,以便它能帮助别人解决同样的问题。
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));