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

6
我正在尝试理解flutter_gallery中的Listexample。我的方法是通过重构成(我的项目)来简化“`”代码。
我在这个提交中看到了一个破坏性的变化。
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('我们想要一个变量在这里');
我理解异常的含义,但不知道是否有办法将变量传递给Text()。
这是VSCode中异常弹出窗口(在红框中): enter image description here 这是Samsung S7手机上的异常: enter image description here 在Stackoverflow上搜索显示this,看起来与我的问题无关。
2个回答

11

在Dart语言中,常量(即const)是编译时的,也就是说,它们不能以任何方式依赖于应用程序运行时,并且只能是简单的无副作用构造函数调用(即const构造函数)或类似字符串、数字和列表/映射等字面值。

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

const version = 'v1.0.0';

我可以在下面使用它:

const Text(version)

Dart 同样支持表达式,但只能作为编译时常量使用:limited

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

然而在您的例子中,text 不是编译时常量。

让我们通过一个简单的示例 showMyName 来观察这个问题:

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

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

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

在未来版的Dart中(使用--preview-dart-2),你可以省略new关键字:

返回:

在未来版的Dart中(使用--preview-dart-2),你可以省略new关键字:

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

1
感谢您详细的解释。我按照您的建议使用了 Text t = new Text(text); 来解决问题。提交记录在这里 - XoXo

0

在这里,你正在使用一个const构造函数:const Text t = const Text(text)。编译器期望一个编译时常量,并因为你传递的参数不是常量而依赖于运行时的值而引发问题。

如果你简单地删除const关键字,它将会编译通过而没有错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接