dart - Dart 中 const 构造函数初始化失败

标签 dart

以下内容:

import 'package:flutter/foundation.dart';

class Bar {
  final int tender;
  
  const Bar(this.tender);
}

class Foo {
  final int foo;
  final Bar bar;

  const Foo({@required foo})
    : foo = foo,
      bar = const Bar(foo);
}

尝试初始化 bar = const Bar(foo) 会导致编译器错误“常量创建的参数必须是常量表达式”。为什么该行会失败,而前面的行 foo = foo 不会失败?

编辑只是为了进一步澄清困惑的根源:实际上,就好像可以用参数 foo 来 const 构造一个 Foo 一样> (在编译时未知),但是用完全相同的参数 const 构造一个 Bar 是不行的。为什么?

最佳答案

该行失败,因为正在传递变量而不是常量/文字来创建Bar<的const对象。编译器不知道 foo 在编译时会是什么,因此无法创建 const Bar(foo)

考虑一下:

void main(){
  int someNonConstantValue = 10;
  const Bar(someNonConstantValue);
}

编译器在这里发出警告,并显示相同的错误消息

Arguments of a constant creation must be constant expressions

这是因为 someNonConstantValue 不是常量。

现在如果代码修改为:

void main(){
  const int someConstantValue = 10;
  const Bar(someConstantValue);
}

没有警告,因为编译器现在确信 someConstantValue 实际上是常量,并且不会随时更改(因此它可以编译和优化代码)。

类似地,在原始示例中,如果进行更改以使用常量文字来创建const Bar(

class Bar {
  final int tender;
  const Bar(this.tender);
}

class Foo {
  final int foo;
  final Bar bar;

  const Foo({@required this.foo})
    : bar = const Bar(10);
} 

添加: 按照与上面相同的解释,如果 const Foo( 传递了 variable

void main(){
  int someNonConstantValue = 10;
  const Foo(foo:someNonConstantValue);
}

您所指的点是其自己的类中的构造函数声明。尚未以任何值调用它。

编辑:

This github issue是对 Dart 早期类似路线的讨论。

This answer提供了相同的解释。

关于dart - Dart 中 const 构造函数初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62692542/

相关文章:

android - Firebase 推送通知未在屏幕上弹出 [Flutter]

flutter - InkWell 小部件需要 Material 小部件祖先

android - 一次性读取Firebase云( Dart/flutter )

flutter - 如何在我的 Flutter 应用程序中向我的 Flutter 路由添加自定义转换

dart - 在哪里设置 protoc 的路径以导入标准 Protocol Buffers

android - 如果 sqflite flutter 中存在,则删除表并重新创建

dart - 在 Flutter 中从 Controller 控制滚动条

image - Flutter CircleAvatar-将Image对象用作(背景)图像/将其类型转换为ImageProvider

firebase - 上传用户个人资料图片 Firebase - Flutter

flutter - 滚动到特定的小部件 Flutter web