Flutter 状态管理 Provider

这篇具有很好参考价值的文章主要介绍了Flutter 状态管理 Provider。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

状态管理必要性

Flutter基于声明式构建UI,原生则是命令式,状态管理是用于解决声明式开发带来的问题。

例:命令式的原生,数据更新需要拿到对应控件并更改其显示值;而声明式则需要更改数据值并通过setstate更新状态,重新构建组件

Flutter 中有这么一种说法: UI = f(state):

声明式的优势

  • 优势:

  • 无需繁琐地控制组件,只需聚焦于状态管理,负责状态—>UI的映射

  • 劣势:

  • 逻辑和页面UI耦合,导致无法复用/单元测试、修改混乱等:MVVM等架构解决

  • 跨页面访问数据

  • 控制页面刷新范围

provider工作原理

provider内部为DelegateWidget(委托组件)是一个StatefulWidget,可更新,具有生命周期,借助各种代理完成
状态共享使用InheritedProvider这个InheritedWidget实现
通过MultiProvider和Consumer封装,对组合与刷新颗粒度控制

provider工作流程:

设置到changeNotifierProvider的changeNotifier被执行addListener添加监听listener
listener内会调用StateDelegate的StateSetter方法,从而调用到StatefulWidget的setState
在changeNotifier执行notifyListeners时,最终触发setState更新

provider异同

  • ListenableProvider / ChangeNotifierProvider

ListenableProvider提供的对象是继承了Listenable抽象类的子类,只能通过继承来实现addListener/removeListener方法,手动管理收听者

changeNotifier实现了Listenable,而混入了changeNotifier的类自动实现了监听管理

ChangeNotifierProvider 和 ListenableProvider 究竟区别在哪呢,ChangeNotifierProvider 会在你需要的时候,自动调用其 _disposer 方法。

  • ValueListenableProvider,提供了继承/混入/实现了ValueListenable的model,专门用于只有一个单一变化数据的ChangeNotifier,通过ValueListenable处理的类不再需要数据更新时调用notifyListeners。

  • StreamProvider,专门提供一条Single Stream,提供了方法捕获异常、更新数据、构建流、构建流控制器等

状态同步

  • 获取顶层数据:flutter在每个element上维护一个InheritedWidget哈希表来向下传递element树中的信息,通常情况下,多个element引用相同的哈希表,并且该表仅在element引入新的InheritedWidget时改变, 时间复杂度为O(1)。
  • 通知刷新:listener模式,model中维护听众,并通过notifiedListener通知刷新,全局状态需放在顶层之上,优先初始化

数据初始化

  • 全局数据:main方法执行,保证只执行一次
  • 单页面数据:StatefulWidget中的InitState中不可执行Provider.of(context),当监听后,在notifyListeners的时候,会触发context所对应的State的[State.build]和[State.didChangeDependencies]方法,数据到来时又会触发下一次请求,无限请求下去。

解决页面和逻辑的耦合

思路:

  • 通过flutter树机制解决,如provider
  • 通过依赖注入,如Get

通过flutter树机制处理V—>P的获取

flutter三棵树:widget、element、render object

widget树是虚拟结构,只是描述组件嵌套关系,但element和renderObject在运行时实际存在。element组件中包含了_parent属性,存放其父节点element,而其又实现了buildContext接口,包含了对树结构操作的方法

原本应该是通过context.findAncestorStateOfType向上获取父组件的信息,在有了provider之后通过provider.of(context)向上获取顶层provider组件中的presenter对象

通过依赖注入解决V—>P的获取

摆脱context依赖,基于get借助一个全局单例的map存储对象,通过依赖注入的方式,实现对Presenter层的获取,使得可在任意类中获取到Presenter

map对应的key是runtimeType+tag,其中tag为可选参数,value对应object

get也可解决跨页面访问数据

避免setstate全局更新

观察者模式,局部更新

  • ValueNotifier、ValueListenableBuilder
  • ChangeNotifierProvider、ChangeNotifier、Consumer:从顶层ChangeNotifierProvider获取存储的ChangeNotifier,Consumer作为子组件获取对应数据

Get对应方式则是Get.put和GetBuilder,Get.put提前存储数据对象,为GetBuilder组件指定数据类型作为泛型,因为Get基于单例,所以GetBuilder可以直接通过泛型获取到存入的对象,在builder方法中暴露,使得组件和数据建立了监听关系,并在数据更新后只驱动将其作为泛型的GetBuilder组件更新

使用缺陷

  • provider的context层级过高,如provider传入的context是根层级的,而provider在element树中是根层级下面

解决:对应组件外嵌套一层builder,拿到该结点对应的context / provider作为根结点文章来源地址https://www.toymoban.com/news/detail-645671.html

  • Get全局单例
    Get全局单例默认以runtimeType为key进行对象存储,而不同详情页实例对应的是同一个class,key值一样,不添加tag参数,在Get.find时会获取到已经存储的对象,即数据混淆了。
    Get存储的对象也得回收,dipose时进行delete或者使用Get中提供的组件,如GetBuilder,会在dispose中释放

到了这里,关于Flutter 状态管理 Provider的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter状态管理 — 探索Flutter中的状态

    前言 随着响应式编程的理念Flutter被大众所了解以来,状态管理一直是一个引人深思的话题。如果想要学习好Flutter这样的响应式的编程框架就一定是离不开状态管理的。我遇到过很多没有了解过响应式编程框架的,或者从事后端开发,自己想用Flutter写个app玩玩的朋友,一上来

    2024年02月09日
    浏览(38)
  • Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理

    Flutter笔记 Flutter的应用生命周期状态(lifecycleState)管理 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134127670 【介绍】: WidgetsBinding.instance 是Flutter中用于管理应用程序事件和生命周期的重要工具

    2024年02月06日
    浏览(42)
  • flutter的状态管理学习

    1.flutter widget分类 组合 渲染 代理 2. 代理组件又分为 Positioned向父组件传递数据 InheritedWidget向子组件传递数据 3. 状态 state 数据 状态就是用到了向子组件传递数据,并且需要刷新的时候刷新组件 4. 刷新 数据变化 获取并在改变的时候会导致刷新 dependOnInheritedWidgetOfExactType 只获

    2024年01月25日
    浏览(42)
  • Flutter InheritedWidget 共享状态管理

    InheritedWidget和React中的context功能类似,可以实现跨组件数据的传递。 定义一个共享数据的InheritedWidget,需要继承自InheritedWidget 这里定义了一个of方法,该方法通过context开始去查找祖先的HYDataWidget(可以查看源码查找过程) updateShouldNotify方法是对比新旧HYDataWidget,是否需要对

    2024年02月14日
    浏览(43)
  • flutter 常见的状态管理器

    当我们构建复杂的移动应用时,有效的状态管理是至关重要的,因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案,下面详细介绍一些常见的状态管理方式:Provider、Bloc 和 Redux、getx 等等一些管理工具。 Provider: Pro

    2024年02月12日
    浏览(41)
  • Flutter 状态管理之GetX库

      Flutter使用的是声明式UI,是通过状态去更新UI组件的,因此我们首先就要学习状态的使用。同样为了简化原本的状态使用,我们会使用Getx库。   之前说要写Flutter,一拖就是一年多,有些不好意思。现在都24年了,终于等到你,下面还是按照我们最属于的思路来吧。 首

    2024年01月23日
    浏览(42)
  • Flutter状态管理:RxDart,详细介绍

    RxDart是一个基于Dart语言的响应式编程库,它提供了一套用于处理异步事件序列的工具。在Flutter应用中,RxDart可以很好地用于管理应用状态。 响应式编程是一种编程范式,它将应用程序的逻辑分解为响应事件的流。当应用程序中发生事件时,可以通过这些流来响应这些事件。

    2024年02月10日
    浏览(39)
  • Flutter Provider使用

    Provider 之状态管理 下载地址: https://pub-web.flutter-io.cn/packages/provider 导入依赖: 导入头文件: 创建 Model 混入 ChangeNotifier 。 Counter 中的私有属性 _count 变化时 ,添加监听 notifyListeners() 设置组件监听使用 MultiProvider ,其中 providers 属性设置需要绑定的数据,即上面的 Counter 类,这

    2024年02月16日
    浏览(36)
  • Flutter 全能型选手GetX —— 状态管理

    使用篇 简介 依赖管理 路由管理 状态管理 主题配置 多语言配置 离线缓存 网络请求 原理篇 Flutter 从源码看Getx的依赖原理 Obx:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法 GetX:响应式状态管理,当数据源变化时,将自动执行刷新组件的方法 GetBuilder:简单

    2024年02月02日
    浏览(46)
  • Flutter中状态管理选项的比较:利弊探索

    Flutter 应用程序开发的一个关键方面是管理状态,这确保了整个应用程序的数据一致性和更新。然而,Flutter 提供了多种状态管理解决方案,每种解决方案都有自己的优缺点。在这篇博客中,我们将探讨 Flutter 中一些流行的状态管理选项,并讨论它们的优缺点。 这些状态管理

    2024年01月25日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包