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
相关产品推荐
相关产品推荐

