为什么 Dart 中的 const Widget 不相同?

OwO*_*OwO 4 constants widget dart flutter

当我们调用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

}
Run Code Online (Sandbox Code Playgroud)

[错误:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:'package:todo_improve/main.dart':断言失败:第 17 行 pos 8:'identical(a, b)':不正确。

Nis*_*ddy 6

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

现在第一种情况和第二种情况之间的一个主要区别是 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));
Run Code Online (Sandbox Code Playgroud)

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

请参阅此线程以获取更多信息。