flutter provider的理解

provider 是flutter 中的状态管理 开源库;

关键角色

  • Model
    数据类;
  • Provider
    顶层的widget,用来存储数据;有三种类型:
  1. Provider

Creates a value, store it, and expose it to its descendants.
只是存储 数据,并不操作数据

  1. 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 extends SingleChildStatelessWidget {

 Widget buildWithChild(BuildContext context, Widget child) {
  //...
    return _InheritedProviderScope();
  }
}

class _InheritedProviderScope extends InheritedWidget {
  //...
}
  1. ChangeNotifierProxyProvider
    和 ChangeNotifierProvider类似,只是 多了 对数据的委托操作;
 ChangeNotifierProxyProvider({
    Key key,
    @required Create create,
    @required ProxyProviderBuilder update,
  • Consumer
    下层(相对provider而言)的widget,用来获取 数据model;
class Consumer extends SingleChildStatelessWidget {

 Consumer({
    Key key,
    @required this.builder,
    Widget child,
  }) 

  @override
  Widget buildWithChild(BuildContext context, Widget child) {
     return builder(
      context,
      Provider.of(context),
      child,
     );
   }

}

主要 通过 Provider.of(context) 函数,来获取;

static T of(BuildContext context, {bool listen = true}) {
 //..
  final inheritedElement = _inheritedElementOf(context);
    if (listen) {
      context.dependOnInheritedElement(inheritedElement);
    }

    return inheritedElement.value;
  }

推荐使用 Provider.of而不是 Consumer,因为 listen默认为true,也就是说 默认 依赖于 持有数据model的widget 对应的element;

Model补充

数据类 可继承的 ChangeNotifier,本身和privider框架 没有关系;
ChangeNotifier 是 flutter框架 提供的工具类,用来实现一对多的订阅通知功能。

你可能感兴趣的:(flutter provider的理解)