跳到主要内容

介绍


什么是 Riverpod?

Riverpod (Provider 的回文) 是 Flutter / Dart 平台的一个响应式缓存框架。它能自动获取、缓存、合并和计算网络请求,同时还会为你处理错误。

动机

现代的应用程序很少带有用户界面所需要的所有信息。一般来说,那些数据会从服务器异步获取。

但问题是,处理异步代码是比较困难的。虽然说 Flutter 本身提供了一些存储状态的方法,但除此之外, 它并没有其他额外的功能。因此,有许多问题仍然没有解决方案:

  • 异步请求需要在本地缓存,因为只要 UI 刷新就重新执行请求的做法是不合理的。
  • 由于缓存的存在,如果我们不小心可能会导致缓存过期。
  • 我们也需要处理错误和加载中的各种状态。

大规模解决问题会比较困难,而且它们受到了许多功能的影响,比如:

  • 下拉刷新
  • 列表滚动加载
  • 在键入时搜索
  • 异步请求防抖
  • 当不再需要时取消异步请求
  • 积极的界面更新
  • 离线模式
  • ...

虽然实现这些功能很棘手,但这对一个良好的用户体验至关重要。 然而很少有其他包文件试图直接解决这些问题,而且大量的样板代码需要手工完成。

这就是 Riverpod 的由来。
受 Flutter 组件的启发,Riverpod 尝试通过一种独特的方式来写业务逻辑,进而来解决这些问题。 对于状态来说,在许多方面 Riverpod 都可以类比于组件。

采用这种新的方式,上述复杂的功能大多都已默认被实现。你要做的只不过是关注 UI 实现。

不信?这里有一个例子。下面的代码片段是使用 Riverpod 的一个简化的 Pub.dev 客户端应用。

// 从 pub.dev 获取包文件列表

Future<List<Package>> fetchPackages(
FetchPackagesRef ref, {
required int page,
String search = '',
}) async {
final dio = Dio();
// 请求 API。这里我们用了 dio,当然你也可以使用任何其他的网络请求库。
final response = await dio.get(
'https://pub.dartlang.org/api/search?page=$page&q=${Uri.encodeQueryComponent(search)}',
);

// 将返回的 JSON 解码到 Dart 的对象。
final json = response.data as List;
return json.map(Package.fromJson).toList();
}

这段代码就是你要实现 “在键入时搜索” + “下拉刷新” + “无限列表” 功能所需的全部业务逻辑,同时还可以处理错误及加载中的状态。