provider 是flutter 中的状态管理 开源库;
关键角色
- Model
数据类; - Provider
顶层的widget,用来存储数据;有三种类型: 
- Provider
 
- ChangeNotifierProvider
 
存储的数据对象 必须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框架 提供的工具类,用来实现一对多的订阅通知功能。










