我正在将函数作为可选参数传递给构造函数,但无法分配默认值。
void main() {
Person p = Person();
print(p.foo('Hello'));
}
class Person {
final String Function(String) foo;
Person({this.foo});
}
现在尝试分配一个默认值:Person({this.foo = (val) {return val;});
产生错误:Error: Not a constant expression.
我知道该参数必须是,const
但是使用const
甚至static
infront(val) {return val;}
都不起作用。
有谁知道如何解决这个问题?
您只能将常量值(也称为编译时常量)用作默认值。您无法创建常量函数文字,因此无法在构造函数中内联编写函数。
但是,对顶级或静态函数的引用是常量,因此您可以将默认值函数声明为静态函数或顶级函数。
void main() {
Person p = Person();
print(p.foo('Hello')); // Prints "Hello"
}
class Person {
final String Function(String) foo;
Person({this.foo = _identity});
static String _identity(String value) => value;
}
// or as top-level.
// String _identity(String value) => value;
如果默认值在实例方法上,并且可以期望任何人扩展或实现您的类,则可以(并且应该)选择将函数公开。在这种情况下,他们需要声明相同的默认值。
通常至少同样有用的另一种选择是不使用默认值,而是null
在使用值之前替换a :
class Person {
final String Function(String) foo;
Person({String Function(String) foo}) : foo = foo ?? _identity;
static String _identity(String value) => value;
}
甚至使用非恒定值:
class Person {
final String Function(String) foo;
Person({String Function(String) foo}) : foo = (foo ?? (String x) => x);
}
对于构造函数,它几乎没有什么区别。如果是实例方法,则使用??
replacenull
避免子类必须使用与默认值完全相同的函数。
我个人建议始终使用??
而不是默认值。由于它允许非恒定值,因此它更加灵活。对于非功能默认值,您必须记录默认行为,而不仅仅是让dartDoc显示{int x = 42}
,但是对于功能,则无论如何都必须记录它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句