阅读 20 SEO

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<T> extends SingleChildStatelessWidget {

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

class _InheritedProviderScope<T> extends InheritedWidget {
  //...
}
  1. 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框架 提供的工具类,用来实现一对多的订阅通知功能。

作者:only_run

原文链接:https://www.jianshu.com/p/ec9961f9eacc

文章分类
后端
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 gxwowoo@163.com 举报,一经查实,本站将立刻删除。
相关推荐