【问题标题】:Should you use "extends" or "with" keyword for ChangeNotifier? - FlutterChangeNotifier 应该使用“extends”还是“with”关键字? - 颤振
【发布时间】:2019-11-02 22:26:00
【问题描述】:

我见过几个使用“extends”和“with”关键字扩展 ChangeNotifier 的模型示例。我不确定有什么区别。

class myModel extends ChangeNotifier {...}

class myModel with ChangeNotifier {...}

这两者有什么区别?我应该使用哪一个?

【问题讨论】:

标签: flutter state


【解决方案1】:

您可以使用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 的好读物:

【讨论】:

  • 那么,为什么 Flutter 提供扩展,而我们总是可以使用 mixin?
  • 你可以混入任何类。一个类不必被注释为一个 mixin 就可以成为一个 Mixin。
【解决方案2】:

extends 用于继承
with 用于将类用作mixin

参考这里了解 mixininheritence 之间的区别:https://stackoverflow.com/a/860312/10471480

参考ChangeNotifier,文档说

一个可以扩展或混合的类,它提供了一个使用 VoidCallback 通知的更改通知 API。

因此您可以继承它,也可以将其用作 mixin

【讨论】:

    【解决方案3】:

    我认为这与传统支持有关。在 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 类的混合]。

    围绕这个有很多讨论:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2011-02-03
      • 2014-09-12
      • 2018-10-25
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多