如何在Dart Riverpod中合并两个同类型Provider以获取最新值
合并同类型Riverpod Provider,输出最新更新值
要实现始终返回最近更新的计数器值的mergeCounterProvider,核心思路是跟踪每个输入Provider的更新时间,通过比较时间戳来确定最新值。以下是完整实现代码:
import 'package:riverpod/riverpod.dart'; // 示例计数器StateNotifier class Counter extends StateNotifier<int> { Counter() : super(0); void increment() { state++; } } // 创建两个同类型的StateNotifierProvider final counterProvider1 = StateNotifierProvider<Counter, int>((ref) => Counter()); final counterProvider2 = StateNotifierProvider<Counter, int>((ref) => Counter()); // 合并后的Provider,返回最近更新的计数器值 final mergeCounterProvider = Provider<int>((ref) { // 初始化时间戳,记录每个计数器的最后更新时间 var counter1LastUpdated = DateTime.now(); var counter2LastUpdated = DateTime.now().subtract(const Duration(seconds: 1)); // 监听counter1的变化,更新对应时间戳 ref.listen<int>(counterProvider1, (_, __) { counter1LastUpdated = DateTime.now(); }); // 监听counter2的变化,更新对应时间戳 ref.listen<int>(counterProvider2, (_, __) { counter2LastUpdated = DateTime.now(); }); // 获取当前两个计数器的数值 final counter1 = ref.watch(counterProvider1); final counter2 = ref.watch(counterProvider2); // 比较时间戳,返回最近更新的数值 return counter1LastUpdated.isAfter(counter2LastUpdated) ? counter1 : counter2; });
关键逻辑说明
- 使用
ref.listen监听两个计数器Provider的状态变化,每次更新时记录当前时间作为该计数器的最后更新时间 - 初始化时通过时间差设置默认优先级,确保初始状态有明确的返回值
- 每次
mergeCounterProvider被触发时,通过比较时间戳判断哪个计数器是最近更新的,返回对应数值
内容的提问来源于stack exchange,提问作者gruvw
相关产品推荐
相关产品推荐

