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

Flutter Riverpod 2.0中,能否基于同一Counter类创建多个NotifierProvider?

Riverpod 2.0代码生成模式下创建多个同类型Provider的方案

背景回顾

在未使用build_runner的Riverpod版本中,我们可以基于同一个StateNotifier类创建多个独立的Provider,示例代码如下:

class Counter extends StateNotifier<int> {
  Counter(): super(0);
  
  void increment() => state++;
}

final counter1Provider = StateNotifierProvider<Counter, int>((ref) => Counter());
final counter2Provider = StateNotifierProvider<Counter, int>((ref) => Counter());

// 使用方式
Counter counter1 = ref.watch(counter1Provider.notifier);
Counter counter2 = ref.watch(counter2Provider.notifier);

升级到Riverpod 2.0并启用代码生成后,Counter类通常会改写为以下形式:

@riverpod
class Counter extends _$Counter {
  @override
  int build() {
    return 0;
  }

  void increment() {
    state++;
  }
}

// 使用方式
Counter counter = ref.watch(counterProvider.notifier);
int counterState = ref.watch(counterProvider);

此时很多开发者会疑惑:这种将StateNotifier与Provider绑定的代码生成模式下,还能不能创建另一个返回该Counter类的Provider?


解决方案:当然可以

有两种常用方式实现需求:

1. 手动创建StateNotifierProvider复用Counter类

直接基于代码生成后的Counter类手动创建新的Provider,注意代码生成的Counter类构造函数需要传入Ref参数:

// 创建第二个返回Counter实例的Provider
final anotherCounterProvider = StateNotifierProvider<Counter, int>((ref) {
  return Counter(ref);
});

// 使用方式
Counter anotherCounter = ref.watch(anotherCounterProvider.notifier);
int anotherCounterState = ref.watch(anotherCounterProvider);

这种方式最直接,能快速得到独立的Counter实例,完全复用原有类的状态逻辑。

2. 基于代码生成创建新Provider并复用逻辑

如果希望继续沿用代码生成的写法,可以创建新的注解类,内部复用Counter的逻辑:

@riverpod
class AnotherCounter extends _$AnotherCounter {
  @override
  int build() {
    // 直接复用Counter的初始状态逻辑
    return 0;
  }

  void increment() {
    // 复用相同的状态更新逻辑
    state++;
  }
}

如果需要更深度的复用,也可以在新Provider中创建Counter实例进行委托,但这种方式不如第一种简洁。


内容的提问来源于stack exchange,提问作者Naduel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:26:55