您应该为 ChangeNotifier 使用“extends”还是“with”关键字?- 颤振

Gar*_* AP 19 state flutter

我已经看到了几个使用 'extends' 和 'with' 关键字扩展 ChangeNotifier 的模型示例。我不确定有什么区别。

class myModel extends ChangeNotifier {...}

class myModel with ChangeNotifier {...}
Run Code Online (Sandbox Code Playgroud)

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

Sur*_*gch 22

您可以使用extends(继承)或with(作为混合)。这两种方法可以让您接触到notifyListeners()的方法ChangeNotifier

遗产

扩展ChangeNotifier意味着它ChangeNotifier是超类。

class MyModel extends ChangeNotifier {
  
  String someValue = 'Hello';
  
  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你的模型类已经扩展了另一个类,那么你不能扩展,ChangeNotifier因为 Dart 不允许多重继承。在这种情况下,您必须使用 mixin。

混入

mixin 允许您使用 mixin 类(即,notifyListeners())的具体方法。

class MyModel with ChangeNotifier {
  
  String someValue = 'Hello';
  
  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,即使您的模型已经从另一个类扩展,您仍然可以“混入” ChangeNotifier

class MyModel extends SomeOtherClass with ChangeNotifier {
  
  String someValue = 'Hello';
  
  void doSomething(String value) {
    someValue = value;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

这里有一些关于 mixin 的好读物:

  • 那么,为什么 Flutter 提供了扩展,而我们总是可以使用 mixin 呢? (4认同)

Man*_*nnu 8

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

请参阅此处以了解mixin继承之间的区别:/sf/answers/60221871/

参考ChangeNotifier,文档说

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

因此你可以继承它并将它用作 mixin