如何解决Dart 编译器是否能够推断 const 构造函数的用法?
我认为 dart 会使用 if not mdic.get('color_detail'):
raise ValueError('No color_detail available')
构造函数(如果它能够自动执行),为了解释这个假设,假设我们有一个小部件,它已经有一个 const
像:
const constructor
然后因为 dart “能够推断出常量用法”,接下来的两个代码都将意味着并被编译成相同的代码:
1.
class Retry extends StatelessWidget {
const Retry();
}
Container(
child: Retry()
)
这是 dart 可以推断他必须对声明了该选项的类使用 Container(
child: const Retry()
)
构造函数的假设吗?或者不是?
我如何证实它?
解决方法
不,Dart 编译器不会推断 const
,除非语法上下文需要常量性,例如如果您编写 const [A()]
将 A()
放入 const 上下文中,这意味着 const [A()]
与 const [const A()]
相同,那么几乎没有其他地方可以应用相同的内容(例如元数据 { {1}})。
一般而言,Dart 编译器无法在语言规范要求的地方之外推断 @A()
,因为它可能会改变程序的语义。考虑:
const
如果编译器只是将 class A {
const A();
}
final Set<A> s = <A>{};
void foo(A a) {
s.add(a);
}
void main() {
foo(A());
foo(A());
print(s.length);
}
放在构造函数调用上,那么该程序将打印 const
,但它应该打印 1
。
Dart 无法推断出您希望该对象是 const
,除非有一些围绕它的上下文强制它是 const
。在您展示的示例中,情况并非如此。如果您想让 dart 做出const
的东西,您必须在某个时候使用 const
关键字。
推断 const
的示例:
const SizedBox(
child: Retry(),)
const
上的 SizedBox
强制 Retry
为 const
。这种情况和类似情况是唯一隐含 const
的地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。