flutter - 为什么 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)':不正确。
解决方案
经过大量研究,这是我发现的。
现在,您的第一种情况和第二种情况之间的一个主要区别是 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
在控制台中看到。
有关更多信息,请参阅此线程。
推荐阅读
- microsoft-translator - Microsoft 自定义翻译器 - 数据处理失败
- presto - presto 是否支持动态添加数据源?
- php - 使用 PHP 在浏览器上将 CSV 文件显示为 HTML 表格
- r - 为什么 data.table 有时需要按两次“输入”才能打印?
- javascript - 默认数组参数未打印 JavaScript 中的所有值
- unit-testing - 在宏上下文测试中使用 panic::catch_unwind 以解决单元测试中的恐慌问题
- php - 获取多个目录中文件夹的文件 URL 的问题
- r - 为什么 stat_summary 会根据变量绘制多条/单条线?
- session - 使用独立节点点燃 Web 会话集群
- unicode - Gnuplot pngcairo 和 postscript 终端没有渲染一些特殊字符?