首页 > 解决方案 > 为什么 Dart 中的 const Widget 不相同?

问题描述

当我们调用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_improve/main.dart':断言失败:第 17 行 pos 8:'相同(a,b)':不正确。

标签: flutterdartwidgetconstants

解决方案


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

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

现在,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在控制台中看到。

有关更多信息,请参阅此线程


推荐阅读