Flutter Riverpod 全面深入解析,为什么官方推荐它?

随着 Flutter 的发展,这些年 Flutter 上的状态管理框架如“雨后春笋”般层出不穷,而近一年以来最受官方推荐的状态管理框架无疑就是 Riverpod ,甚至已经超过了 Provider ,事实上 Riverpod 官方也称自己为 “Provider,但与众不同”。

Provider 本身用它自己的话来说是 “InheritedWidget 的封装,但更简单且复用能力更强。” ,而 Riverpod 就是在 Provider 的基础上重构了新的可能。

关于过去一年状态管理框架的对比可以看 《2021 年的 Flutter 状态管理:如何选择?》本文主要是带你解剖 RiverPod 的内部是如何实现,理解它的工作原理,以及如何做到比 Provider 更少的模板和不依赖 BuildContext

前言

如果说 Riverpod 最明显的特点是什么,那就是外部不依赖 BuildContext (其实就是换了另外一种依赖形态),因为不依赖 BuildContext ,所以它可以比较简单做到类似如下的效果:

也就是 Riverpod 中的 Provider 可以随意写成全局,并且不依赖 BuildContext 来编写我们需要的业务逻辑

⚠️ 提前声明下,这里和后续的 Provider ,和第三方库 provider 没有关系

Riverpod 具体内部是怎么实现的呢?接下来让我们开始探索 Riverpod 的实现原理。

Riverpod 的实现相对还是比较复杂,所以还耐心往下看,因为本篇是逐步解析,所以如果看的过程有些迷惑可以先不必在意,通篇看完再回过来翻阅可能就会更加明朗

从 ProviderScope 开始

在 Flutter 里只要使用了状态管理,就一定避不开 InheritedWidget , Riverpod 里也一样,在 Riverpod 都会有一个 ProviderScope, 一般只需要注册一个顶级的 ProviderScope

如果对于 InheritedWidget 还有疑问,可以看我掘金:《全面理解State与Provider》

先从一个例子开始,如下图所示,是官方的一个简单的例子,可以看到这里:

  • 嵌套一个顶级 ProviderScope
  • 创建了一个全局的 StateProvider
  • 使用 ConsumerWidgetref 对创建的 counterProvider 进行 read 从而读取 State ,获取到 int 值进行增加 ;
  • 使用另一个 Consumerref 对创建的 counterProvider 进行 watch ,从而读取到每次改变后的 int 值;

很简单的例子,可以看到没有任何 of(context) , 而全局的 counterProvider 里的数据,就可以通过 ref 进行 read/watch,并且正确地读取和更新。

那这是怎么实现的呢?counterProvider 又是如何被注入到 ProviderScope 里面?为什么没有看到 context? 带着这些疑问我们继续往下探索。

首先我们看 ProviderScope ,它是唯一的顶级 InheritedWidget ,所以 counterProvider 必定是被存放在这里:

在 RiverPod 里, ProviderScope 最大的作用就是提供一个 ProviderContainer

更具体地说,就是通过内部嵌套的 UncontrolledProviderScope 提供,所以到这里我们可以知道:ProviderScope 可以往下提供状态共享,因为它内部有一个 InheritedWidget ,而主要往下共享的是 ProviderContainer 这个类

所以首先可以猜测:我们定义的各种 Providers, 比如上面的 counterProvider , 都是被存到 ProviderContainer 中,然后往下共享。

事实上官方对于 ProviderContainer 的定义就是:用于保存各种 Providers 的 State ,并且支持 override 一些特殊 Providers 的行为

ProviderContainer

这里出现了一个新的类,叫 ProviderContainer ,其实一般情况下使用 RiverPod 你都不需要知道它,因为你不会直接操作和使用它,但是你使用 RiverPod 的每个行为都会涉及到它的实现,例如 :

  • ref.read 会需要它的 Result read<Result>
  • ref.watch 会需要它的 ProviderSubscription<State> listen<State>
  • ref.refresh 会需要它的 Created refresh<Created>

就算是各种 Provider 的保存和读取基本也和它有关系,所以它作为一个对各种 Provider 的内部管理的类,实现了 RiverPod 里很关键的一些逻辑。

“Provider” 和 “Element”

那前面我们知道

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要安装和管理Flutter SDK工具,你需要以下几个步骤: 1. 首先,你需要下载和安装git客户端。你可以从git官方网站下载适合你操作系统的版本。\[2\] 2. 接下来,你需要从Flutter SDK的官方GitHub仓库中将源代码克隆到本地。你可以使用git命令来完成这个步骤。具体的克隆命令可以在官方文档中找到。\[2\] 3. 一旦你克隆了Flutter SDK的源代码,你就可以使用官方提供的flutter channel命令来管理Flutter SDK的版本。这个命令可以让你升级或回退到不同的Flutter SDK版本。具体的使用方法可以在官方文档中找到。\[1\] 总结起来,为了安装和管理Flutter SDK工具,你需要下载和安装git客户端,并从Flutter SDK的官方GitHub仓库中克隆源代码。然后,你可以使用官方提供的flutter channel命令来管理Flutter SDK的版本。希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Flutter SDK安装、切换版本及常见问题整理](https://blog.csdn.net/qq_16221009/article/details/125981120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [flutter sdk_是什么使Flutter如此强大的流行SDK](https://blog.csdn.net/weixin_26724741/article/details/108971142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值