在 Dart 中将子类分配给工厂构造函数

iDe*_*ode 4 dart flutter

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

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我收到错误:

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

class Bar extends Foo {
  Bar() : super.empty();
}
Run Code Online (Sandbox Code Playgroud)

其实我不太明白这个工厂构造函数暨变量有什么用。谁能解释一下。

jam*_*lin 10

一个构造函数如:

const factory Key(String value) = ValueKey<String>;
Run Code Online (Sandbox Code Playgroud)

称为重定向工厂构造函数。它们并不广为人知(即使在 Dart 和 Flutter 团队中),因为Dart 语言教程 中没有提及它们,但在Dart 语言规范(截至版本 2.10)第 10.6.2 节中提到了它们:

重定向工厂构造函数指定对另一个类的构造函数的调用,每当调用重定向构造函数时都会使用该类的构造函数。

您尝试使用它们:

const factory Foo(int i) = Bar; // Error
Run Code Online (Sandbox Code Playgroud)

不起作用有两个原因:

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

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

常量重定向构造函数无法重定向到非常量构造函数。

重定向的构造函数“Bar Function()”具有与“Foo Function(int)”不兼容的参数。