river_pod
一种简单的方式来访问状态,同时为 Flutter 提供健壮且可测试的解决方案
一个状态管理库,它会在编译时而不是运行时捕获编程错误
- 在编译时而不是运行时捕获编程错误
- 消除了监听/组合对象的嵌套
- 确保代码可测试
该项目可以被视为对 provider 的重写,以进行改进
否则将无法实现。
长话短说
-
将您的 Provider 声明为全局变量
final counterProvider = StateNotifierProvider((ref) { return Counter(); }); class Counter extends StateNotifier<int> { Counter(): super(0); void increment() => state++; } -
在小部件中以编译安全的方式使用它们。没有运行时异常!
class Example extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final count = ref.watch(counterProvider); return Text(count.toString()); } }
动机
如果 provider 是 InheritedWidget 的简化,那么 Riverpod 是
从头开始重新实现 InheritedWidget。
它在原理上与 provider 非常相似,但也存在重大差异
作为修复 provider 面临的常见问题的尝试。
Riverpod 有多个目标。首先,它继承了 provider 的目标
- 能够安全地创建、观察和处置状态,而无需担心
在小部件重建时丢失状态。 - 默认情况下,使我们的对象在 Flutter 的开发工具中可见。
- 可测试且可组合
- 当有多个 InheritedWidget 时,提高其可读性
(这将自然导致深度嵌套的小部件树)。 - 通过单向数据流使应用程序更具可伸缩性。
从此,Riverpod 更进一步
- 读取对象现在是 **编译安全** 的。不再有运行时异常。
- 它使 provider 模式更加灵活,从而支持常见
请求的功能,如- 能够拥有同一类型的多个 Provider。
- 在不再使用时处置 Provider 的状态。
- 拥有计算出的状态
- 将 Provider 设为私有。
- 简化复杂的对象图。依赖异步状态更容易。
- 使模式独立于 Flutter
这些是通过不再使用 InheritedWidget 来实现的。相反,Riverpod
实现了自己的机制,该机制以类似的方式工作。