You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:45:56