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

Jef*_*iao 2 const dart flutter

我想了解的List 例子flutter_gallery。我的方法是通过重构为(我的项目)来简化代码。

我看到此提交中的重大更改

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);
Run Code Online (Sandbox Code Playgroud)

源代码起始行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,
          )),
    );
  }
Run Code Online (Sandbox Code Playgroud)

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

我理解异常的含义,但是想知道是否有一种方法可以将变量传递给Text()。

这是VSCode中的异常弹出窗口(在红色框中): 在此处输入图片说明

这是Android手机(Samsung S7)上的例外 在此处输入图片说明

在Stackoverflow上进行的搜索显示,这与我的问题无关。

mat*_*rey 6

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

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

const version = 'v1.0.0';
Run Code Online (Sandbox Code Playgroud)

我可以在下面使用它:

const Text(version)
Run Code Online (Sandbox Code Playgroud)

Dart还支持有限的表达式以及编译时常量:

const Text('My version is: $version')
Run Code Online (Sandbox Code Playgroud)

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

让我们通过一个更简单的示例进行查看showMyName

Widget showMyName(String name) => const Text(name);
Run Code Online (Sandbox Code Playgroud)

这将产生与您看到的错误相同的错误,因为我们试图从运行时提供的值(参数)创建一个编译时常Textname。当然,我们不需要 Text是编译时常量。您可以简单地使用new

Widget showMyName(String name) => new Text(name);
Run Code Online (Sandbox Code Playgroud)

在Dart的未来版本中(带有--preview-dart-2),您可以省略new

Widget showMyName(String name) => Text(name);
Run Code Online (Sandbox Code Playgroud)