flutter文本异常 - 表达式不是有效的编译时常量

时间:2018-03-09 00:50:37

标签: dart const flutter

我正在尝试理解example中的List flutter_gallery。 我的方法是通过重构(my project)来简化``代码。

我看到this commit

发生了重大变化
I/flutter (14712): 'file:///Users/hong/Flutter/github/flutter_gallery_material_list/lib/main.dart': error: line 54:
I/flutter (14712): expression is not a valid compile-time constant
I/flutter (14712):     const Text t = const Text(text);

源代码起始行53是:

  MergeSemantics _mergeSemanticsOf(String text, _MaterialListType listType) {
    const Text t = const Text(text);
    //const Text t = const Text('we want a variable here');
    return new MergeSemantics(
      child: new ListTile(
          dense: true,
          title: t,
          trailing: new Radio<_MaterialListType>(
            value: listType,
            groupValue: _itemType,
            onChanged: changeItemType,
          )),
    );
  }

我只能使用以下内容进行编译: const Text t = const Text('we want a variable here');

我理解异常所说的内容,但想知道是否有办法将变量传递给Text()。

这是VSCode中的异常弹出窗口(在红色框中): enter image description here

这是Android手机(三星S7)的例外 enter image description here

对Stackoverflow的搜索显示this,这与我的问题无关。

1 个答案:

答案 0 :(得分:5)

Dart中的常量(即const)是编译时,也就是说,它们无论如何都不能依赖于应用程序的运行时,并且只能是简单的副作用自由构造函数调用(即const构造函数)或字符串,如字符串,数字和列表/映射。

例如, this 是一个编译时字符串:

const version = 'v1.0.0';

我可以在下面使用它:

const Text(version)

Dart也支持有限的表达式,作为编译时常量:

const Text('My version is: $version')

但是在您的示例中,text不是编译时常量。

让我们通过一个名为showMyName的简单例子来查看:

Widget showMyName(String name) => const Text(name);

这将得到与您所看到的相同的错误,因为我们尝试从运行时提供的值(参数{{1})创建编译时常量Text })。当然,我们不需要 name作为编译时常量。您只需使用Text

即可
new

在未来版本的Dart(Widget showMyName(String name) => new Text(name); )中,您可以省略--preview-dart-2

new