Flutter - 如何在 Flutter Riverpod Generator 中使用 Notifier 和 AsyncNotifier
通过引用 riverpod_generator 包,使得使用 Riverpod 编写 Flutter 应用程序更加容易且快速(使用 @riverpod
注解和通过 builder_runner
自动生成所有 providers)。
通过 上篇文章 ,我们介绍了 Riverpod Generator 的基本使用,本篇文章,我们将进一步了解 Notifier
和 AsyncNotifier
类。
这些类的出现是为了取代 StateNotifier
,并且有了如下的好处:
- 更容易执行异步初始化
- 不再需要传递
ref
- 不再需要手动声明 provider(如果使用 Riverpod Generator)
我们现在开始来了解吧!
将涵盖的内容
为了更便于理解,我们将使用两个示例。
1. 计数器
第一个例子我会使用一个基于 StateProvider
的简单计数器,然后基于 Notifer
将它进行转换,最后通过 Riverpod Generator 我们看一下如何自动生成 NotifierProvider
。
2. 带有异步请求的列表页面
第二个例子我会构造一个列表页面,数据是由异步获取。尝试使用 AsyncNotifier
替代传统写法。
计数器
首先,我们使用 StateProvider
来构建一个 counterProvider
:
以上的代码大家应该最熟悉不过了:
- 可以在
build
方法中watch
counterProvider
的值 - 在按钮回调中可以对值进行改变
这个例子非常适用于简单变量的存储,但是如果你的状态复杂一些或者带有一些逻辑,那么 StateProvider
就无法正常使用,你可能会用到 StateNotifierProvider
结合 StateNotifier
来解决这个问题。但现在建议使用新的 Notifier
类。
Notifier
下面是我们演示如何声明一个基于 Notifier
的 Counter
类。
可以看到,build
方法返回默认值,并且可以在里面添加方法来实现复杂逻辑。
如果想创建一个 provider 可以像下面这样 CounterNotifier.new
构造:
Notifier 和 Riverpod Generator
以下是我们如何使用新的 @riverpod
语法声明相同的 Counter
类:
可以看到:
- 自动为我们创建了
counterProvider
_$Counter
是AutoDisposeNotifier<int>
稍微复杂一点的例子
这个例子稍微复杂了一些,有一个列表页面,有「datasource」和「index」两个属性。
但如果我们的初始化数据是异步获取的呢?我们该怎么使用?
可以使用 AsyncNotifier
创建异步状态类并完全替换 StateNotifier
和 StateNotifierProvider
。让我们接着往下看。
带有异步请求的列表页面
当初始化的数据是异步获取的,我们可以用下面的方式来构造我们的 service:
可以看到自动生成了一个类型为
AutoDisposeAsyncNotifierProvider<ListViewService, ListVieweState>
的 provider。widget 中可以这样使用:
同样
build
方法也可以传参数,可以理解为 family
的平替,而且再也不用传递 ref
了:
这篇文章篇幅比较短,如果熟悉了上篇文章且已经会使用了 @riverpod
注解,那么你会发现这篇文章的内容实现起来非常简单。
我会在下篇文章分享一个我个人写的全部由 Riverpod Generator 通篇生成 provider 的 demo。
赶紧去试试吧!
转载自:https://juejin.cn/post/7244435485174612025