Dart-const构造函数:使用函数初始化类成员

时间:2018-09-17 11:39:00

标签: dart

我想使用相同的函数初始化几个最终成员变量。不幸的是,dart不允许在const构造函数的初始化列表中进行函数调用:

int fun(int val) => val + 1;

class Foo {
  final int a;
  final int b;
  final int c;
  const Foo(int a, int b, int c)
      : a = fun(a),  <-- this won't compile because 
        b = fun(b),  <-- the constructor
        c = fun(c);  <-- is const
}

我绝对需要构造函数为一个常量表达式(以保持与现有第三方库代码的兼容性)。 我能想到的唯一解决方法是重复将整个函数主体复制并粘贴到初始化程序列表中。 我已经看到了一些flutter库中使用的这种反模式。我还是宁愿避免这种情况。 有人知道更干净的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我认为不可能。

创建任何计算结果的对象,使结果不为const

我唯一想到的解决方案是使用source_gen和build_runner之类的工具进行代码生成,因此您可以在编译时执行功能。

答案 1 :(得分:0)

用私有构造函数定义工厂函数怎么样?

Foo._privateConstructor(int a, int b, int c);

然后使用

factory Foo(int rawA, int rawB, int rawC) {
int a = func(rawA);
int b = func(rawB);
int c = func(rawC);
return Foo._privateConstructor(a,b,c);
}