【问题标题】:Why are const Widgets in Dart not identical?为什么 Dart 中的 const Widget 不相同?
【发布时间】:2021-08-26 00:39:08
【问题描述】:

当我们在使用 const 构造函数创建的两个小部件上调用 identical() 时,它返回 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_improve/main.dart':断言失败:第 17 行 pos 8:'相同(a,b)':是不正确。

【问题讨论】:

标签: flutter dart widget constants


【解决方案1】:

经过大量研究,这是我发现的。

现在您的第一种情况和第二种情况之间的一个主要区别是,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));

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

请参阅此thread 了解更多信息。

【讨论】:

  • 非常感谢!!!!我不知道有这样的事情。
  • 很高兴能帮上忙。请考虑接受答案,以便它可以帮助其他有相同问题的人。 :)
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2012-11-14
  • 2019-03-28
  • 1970-01-01
  • 2020-12-01
  • 2017-10-22
  • 2019-06-26
相关资源
最近更新 更多