【问题标题】:Assigning subclass to a factory constructor in Dart在 Dart 中将子类分配给工厂构造函数
【发布时间】:2021-10-10 11:13:50
【问题描述】:

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();
}

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

【问题讨论】:

  • 一个明显的问题是Bar 没有const 构造函数,而Foo 工厂构造函数需要它。
  • 另一个大问题是您正在使用重定向构造函数(来自=),这要求两个构造函数具有相同的参数。
  • @jamesdlin 谢谢先生,那行得通。虽然我从未见过= 被用于重定向构造函数调用,但我只见过: 用于它们。
  • @jamesdlin 如果你不写答案,我可以写答案吗? (虽然如果你写一个答案我会很感激)。谢谢

标签: flutter dart


【解决方案1】:

这样的构造函数:

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

被称为重定向工厂构造函数。自 they aren't mentioned in the Dart Language Tour 以来,它们并不知名(即使在 Dart 和 Flutter 团队中),但在(截至 2.10 版)第 10.6.2 节中的 the Dart Language Specification 中提到了它们:

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

您尝试使用它们:

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

不起作用有两个原因:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2019-05-22
    相关资源
    最近更新 更多