provider 是flutter 中的状态管理 开源库;
关键角色
- Model
数据类; - Provider
顶层的widget,用来存储数据;有三种类型:
- Provider
Creates a value, store it, and expose it to its descendants.
只是存储 数据,并不操作数据
- ChangeNotifierProvider
/// Listens to a [ChangeNotifier], expose it to its descendants and rebuilds dependents
存储的数据对象 必须extends ChangeNotifier;下层widget 通过 Provider.of(context)
函数 获取model对象 ,并且可以建立依赖关系;当数据对象发生变化时,依赖的widget 会重新build,像不像InheritedWidget Provider 没错 下层widget就是 封装了InheritedWidget
class InheritedProvider<T> extends SingleChildStatelessWidget {
Widget buildWithChild(BuildContext context, Widget child) {
//...
return _InheritedProviderScope<T>();
}
}
class _InheritedProviderScope<T> extends InheritedWidget {
//...
}
- ChangeNotifierProxyProvider
和 ChangeNotifierProvider类似,只是 多了 对数据的委托操作;
ChangeNotifierProxyProvider({
Key key,
@required Create<R> create,
@required ProxyProviderBuilder<T, R> update,
- Consumer
下层(相对provider而言)的widget,用来获取 数据model;
class Consumer<T> extends SingleChildStatelessWidget {
Consumer({
Key key,
@required this.builder,
Widget child,
})
@override
Widget buildWithChild(BuildContext context, Widget child) {
return builder(
context,
Provider.of<T>(context),
child,
);
}
}
主要 通过 Provider.of<T>(context) 函数,来获取;
static T of<T>(BuildContext context, {bool listen = true}) {
//..
final inheritedElement = _inheritedElementOf<T>(context);
if (listen) {
context.dependOnInheritedElement(inheritedElement);
}
return inheritedElement.value;
}
推荐使用 Provider.of而不是 Consumer,因为 listen默认为true,也就是说 默认 依赖于 持有数据model的widget 对应的element;
Model补充
数据类 可继承的 ChangeNotifier,本身和privider框架 没有关系;
ChangeNotifier 是 flutter框架 提供的工具类,用来实现一对多的订阅通知功能。