初始化程序必须是编译时常量

时间:2012-07-05 20:37:06

标签: dart

我只想要一个带颜色的最终列表:

final List<String> COLORS =  ['#cefbe4', '#81ec72', '#5cd646'];
final num MAX = 90;
class Square {
 // ...

它适用于MAX,但它不会为列表编译: 初始化程序必须是编译时常量

我也尝试过:

static final num MAX = 90;
class Square {
    final List<String> COLORS =  ['#cefbe4', '#81ec72', '#5cd646'];

新错误:“初始化程序必须是编译时常量”

我发现唯一的解决方案是在构造函数中初始化... 我不喜欢这个解决方案:我不想要Square对象的列表实例。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

我没有得到和你一样的错误。在第一种情况下,我得到一个编译时警告“Expected constant expression”,在第二种情况下,我得到另一个编译时警告和运行时错误。尝试使用最新的SDK here

static final num MAX = 90;
class Square {
    final List<String> COLORS =  ['#cefbe4', '#81ec72', '#5cd646'];

在这种情况下,静态没有任何意义,因为 static 表示类变量,它们对于同一个类的所有实例化对象都是相同的。在这种情况下, MAX 位于类边界之外。因此会显示运行时错误和编译时警告(“顶级字段不能为静态”)。

我认为 MAX COLORS 对于 Square 类的所有实例都应该是相同的。所以这样做是有道理的:

class Square {
    static final List<String> COLORS = const ['#cefbe4', '#81ec72', '#5cd646'];
    static final num MAX = 90;
}

答案 1 :(得分:0)

列表本身是最终的部分,而不是内容。最终列表中的内容仍然可以添加和删除。

final List<String> COLOURS = new ArrayList<String>();

这将创建您的列表。列表的实际填充将在构造函数中完成,或者在代码中的任何位置完成。

在我看来,使用枚举更合适。