首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Dart中的const部件不完全相同?

为什么Dart中的const部件不完全相同?
EN

Stack Overflow用户
提问于 2021-06-09 02:45:46
回答 1查看 143关注 0票数 3

当我们在两个使用identical()构造函数创建的小部件上调用const时,它返回false。然而,在对两个非小部件对象调用相同的同时,它返回true

那是为什么?

代码语言:javascript
复制
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_精进/main.dart’:失败断言:第17行pos 8:“完全相同(a,b)”:不是真。

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 04:20:07

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

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

现在,flutter有一个--track-widget-creation标志,默认情况下在调试模式中启用它。

这是导致您看似const小部件非identical的主要罪魁祸首。

这意味着,当您在发布模式下运行应用程序时,您的小部件实际上将是compile time constants,因此identical函数将返回true。

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

代码语言:javascript
复制
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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67896851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档