Dart中工厂构造函数绑定子类实现报错及用法疑问
报错原因
你这段代码报错是三个不匹配规则导致的:
- 你用
const修饰了工厂构造函数,那它重定向的目标构造函数Bar()必须也是const构造,你当前的Bar是普通构造,不满足const要求。 - 工厂构造
Foo(int i)接收一个int类型的入参,但你重定向的Bar()是无参构造,参数列表不匹配。 Bar调用的父类构造Foo.empty()是普通构造,无法被const的子类构造调用。
修正后的可运行代码:
class Foo { // 父类构造改为const,才能被子类的const构造调用 const Foo.empty(); const factory Foo(int i) = Bar; } class Bar extends Foo { // 声明const构造,接收和工厂构造匹配的int参数 const Bar(int i) : super.empty(); }
重定向工厂构造的用途
你所说的「类似变量声明」的工厂构造,是Dart特有的重定向工厂构造语法,作用是把当前类的构造逻辑直接绑定到另一个类的构造函数上,不需要手动编写return逻辑,常见使用场景有三个:
- 隐藏内部实现:比如Flutter的
Key是抽象类,对外只暴露Key(String value)的构造入口,用户不需要感知实际返回的是ValueKey<String>子类实例,后续如果要替换Key的默认实现,用户侧的代码不需要做任何修改,实现了接口和实现的解耦。 - 统一构造规范:你可以在父类中定义统一的入参规则,所有子类都按照这个规则实现构造,用户调用时只需要记住父类的构造方式,不需要记忆不同子类的构造差异,降低使用成本。
- 简化const常量实现:用const修饰的重定向工厂构造,Dart会自动对相同入参的实例做编译时复用,不需要你手动实现缓存逻辑,就能获得常量实例的性能优势。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

