【发布时间】:2019-11-02 22:26:00
【问题描述】:
我见过几个使用“extends”和“with”关键字扩展 ChangeNotifier 的模型示例。我不确定有什么区别。
class myModel extends ChangeNotifier {...}
class myModel with ChangeNotifier {...}
这两者有什么区别?我应该使用哪一个?
【问题讨论】:
我见过几个使用“extends”和“with”关键字扩展 ChangeNotifier 的模型示例。我不确定有什么区别。
class myModel extends ChangeNotifier {...}
class myModel with ChangeNotifier {...}
这两者有什么区别?我应该使用哪一个?
【问题讨论】:
您可以使用extends(继承)或with(作为mixin)。这两种方式都可以让您访问ChangeNotifier 中的notifyListeners() 方法。
扩展ChangeNotifier 意味着ChangeNotifier 是超类。
class MyModel extends ChangeNotifier {
String someValue = 'Hello';
void doSomething(String value) {
someValue = value;
notifyListeners();
}
}
如果你的模型类已经在扩展另一个类,那么你不能扩展ChangeNotifier,因为 Dart 不允许多重继承。在这种情况下,您必须使用 mixin。
mixin 允许您使用 mixin 类的具体方法(即notifyListeners())。
class MyModel with ChangeNotifier {
String someValue = 'Hello';
void doSomething(String value) {
someValue = value;
notifyListeners();
}
}
因此,即使您的模型已经从另一个类扩展,您仍然可以“混入”ChangeNotifier。
class MyModel extends SomeOtherClass with ChangeNotifier {
String someValue = 'Hello';
void doSomething(String value) {
someValue = value;
notifyListeners();
}
}
这里有一些关于 mixins 的好读物:
【讨论】:
extends 用于继承类with 用于将类用作mixin
参考这里了解 mixin 和 inheritence 之间的区别:https://stackoverflow.com/a/860312/10471480
参考ChangeNotifier,文档说
一个可以扩展或混合的类,它提供了一个使用 VoidCallback 通知的更改通知 API。
因此您可以继承它,也可以将其用作 mixin
【讨论】:
我认为这与传统支持有关。在 Dart 2.1.0 中引入了 mixin 关键字。根据文档,你应该AVOID mixing in a type that isn’t intended to be a mixin:
出于兼容性原因,Dart 仍然允许您混合类 不是使用 mixin 定义的。但是,这是有风险的。如果作者 该类不打算将该类用作mixin,它们可能 以打破 mixin 限制的方式更改类。为了 例如,如果他们添加了一个构造函数,你的类就会中断。
如果该类没有文档注释或明显的名称,例如 IterableMixin,假设你不能在没有声明的情况下混入类 使用 mixin。
由于 Dart 不允许多重继承,因此 ChangeNotifier API 允许将其混入。正如文档所述:
一个可以扩展或混合的类,它提供了一个变化 使用 VoidCallback 进行通知的通知 API。
恕我直言,要与语言规范 Flutter 保持一致,应该更改 ChangeNotifier,将那些可重用的实现分离到 Mixin 类中。至少 Dart 文档让我认为这是在未来版本中不再支持的东西[非 mixin 类的混合]。
围绕这个有很多讨论:
【讨论】: