让我们分步进行。
什么是 ChangeNotifier?
扩展ChangeNotifier 的类可以调用notifyListeners(),只要该类中的数据已更新并且您想让侦听器知道该更新。这通常在视图模型中完成,以通知 UI 根据新数据重建布局。
这是一个例子:
class MyChangeNotifier extends ChangeNotifier {
int _counter = 0;
int get counter => _counter;
void increment() {
_counter++;
notifyListeners();
}
}
我在A beginner’s guide to architecting a Flutter app 中写了更多关于此的内容。
什么是 ChangeNotifierProvider?
ChangeNotifierProvider 是Provider package 中的many types of providers 之一。如果您已经有一个 ChangeNotifier 类(如上面的类),那么您可以使用 ChangeNotifierProvider 将其提供给 UI 布局中您需要它的位置。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<MyChangeNotifier>( // define it
create: (context) => MyChangeNotifier(), // create it
child: MaterialApp(
...
child: Consumer<MyChangeNotifier>( // get it
builder: (context, myChangeNotifier, child) {
...
myChangeNotifier.increment(); // use it
特别注意,MyChangeNotifier 类的一个新实例是在这一行中创建的:
create: (context) => MyChangeNotifier(),
这是在第一次构建小部件时完成的,而不是在后续重建时完成。
那么 ChangeNotifierProvider.value 是什么?
如果您已经创建了ChangeNotifier 类的实例,请使用ChangeNotifierProvider.value。如果您在StatefulWidget 的State 类的initState() 方法中初始化了ChangeNotifier 类,则可能会发生这种情况。
在这种情况下,您不希望创建 ChangeNotifier 的全新实例,因为您将浪费您已经完成的任何初始化工作。使用 ChangeNotifierProvider.value 构造函数允许您提供预先创建的 ChangeNotifier 值。
class _MyWidgeState extends State<MyWidge> {
MyChangeNotifier myChangeNotifier;
@override
void initState() {
myChangeNotifier = MyChangeNotifier();
myChangeNotifier.doSomeInitializationWork();
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<MyChangeNotifier>.value(
value: myChangeNotifier, // <-- important part
child: ...
请特别注意这里没有create 参数,而是value 参数。这就是你传入ChangeNotifier 类实例的地方。同样,不要尝试在那里创建新实例。
您也可以在官方文档中找到ChangeNotifierProvider和ChangeNotifierProvider.value的用法:https://pub.dev/packages/provider#exposing-a-value