在Dart中将子类赋值给工厂构造函数



Flutter中的Key类有一个factory构造函数,其工作方式更像一个变量。

abstract class Key {
const factory Key(String value) = ValueKey<String>;
// ...
}

但是当我这样做的时候,我得到了一个错误:

class Foo {
Foo.empty();
const factory Foo(int i) = Bar; // Error
}
class Bar extends Foo {
Bar() : super.empty();
}

实际上我不太明白这个工厂构造函数和变量的用途是什么。谁能解释一下?

如下构造函数:

const factory Key(String value) = ValueKey<String>;

被称为重定向工厂构造器。它们并不为人所知(即使在Dart和Flutter团队中),因为在Dart语言指南中没有提到它们,但是在Dart语言规范(从2.10版本开始)第10.6.2节中提到了它们:

A重定向工厂构造函数指定对另一个工厂构造函数的调用在调用重定向构造函数时使用的类。

尝试使用它们:

const factory Foo(int i) = Bar; // Error

不能工作有两个原因:

  • 您将Foo工厂构造函数声明为const,但默认的Bar构造函数不是const。要么从Foo工厂构造函数中删除const,要么将Bar默认构造函数设置为const(这也需要将Foo.empty构造函数设置为const)。
  • 注意,当您使用=重定向工厂构造函数时,您没有机会指定如何传递参数。这是因为重定向工厂构造函数要求两个构造函数具有相同的参数。要么从Foo工厂构造函数中删除未使用的参数,要么让Bar的构造函数也接受int参数。

你应该注意从静态分析中得到的错误;他们解释了以上两个问题。在DartPad中,我得到:

常量重定向构造函数不能重定向到非常量构造函数。

重定向构造函数"Bar()函数"有不兼容的参数函数Foo (int)。

最新更新