如何使用Riverpod Generator生成各类Provider?
使用Riverpod Generator创建各类Provider的方法
借助riverpod_generator,我们可以通过注解方式快速创建基础Provider:
@riverpod int foo(FooRef ref) => 0;
这和传统写法效果完全一致:
final fooProvider = Provider((ref) => 0);
针对FutureProvider、StateProvider等其他Provider,同样可以用注解方式实现,具体写法如下:
FutureProvider
定义返回Future类型的函数,Ref类型会自动以函数名前缀生成(比如函数名为fetchUser,Ref就是FetchUserRef):
@riverpod Future<User> fetchUser(FetchUserRef ref) async { final response = await http.get(Uri.parse('https://api.example.com/users/1')); return User.fromJson(jsonDecode(response.body)); }
等价于传统写法:
final fetchUserProvider = FutureProvider((ref) async { final response = await http.get(Uri.parse('https://api.example.com/users/1')); return User.fromJson(jsonDecode(response.body)); });
StateProvider
通过类继承_$[类名]的方式实现,build方法返回初始状态,还能直接在类内定义状态操作方法:
@riverpod class Counter extends _$Counter { @override int build() => 0; void increment() => state++; void decrement() => state--; }
等价于传统写法:
final counterProvider = StateProvider((ref) => 0);
注解写法的优势在于可以把状态修改逻辑封装在类内,代码更聚合。
StateNotifierProvider
同样用类继承方式,build返回初始状态,类内实现复杂状态操作逻辑:
@riverpod class TodoList extends _$TodoList { @override List<Todo> build() => []; void addTodo(Todo todo) => state = [...state, todo]; void toggleTodo(String id) { state = state.map((todo) { if (todo.id == id) return todo.copyWith(completed: !todo.completed); return todo; }).toList(); } }
等价于传统写法:
class TodoListNotifier extends StateNotifier<List<Todo>> { TodoListNotifier() : super([]); void addTodo(Todo todo) => state = [...state, todo]; void toggleTodo(String id) { state = state.map((todo) { if (todo.id == id) return todo.copyWith(completed: !todo.completed); return todo; }).toList(); } } final todoListProvider = StateNotifierProvider<TodoListNotifier, List<Todo>>((ref) => TodoListNotifier());
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

