如何用Riverpod代码生成实现该StateNotifierProvider?
手动StateNotifier转Riverpod代码生成实现方案
原手动实现代码
class SessionProvider extends StateNotifier<Session> { final Ref ref; final sessionManager = singleton<ApiClient>().sessionManager; final client = singleton<ApiClient>().client; SessionProvider(this.ref, Session initial) : super(initial) { init(); } init() { updateUser(); } updateUser() async { final user = sessionManager.signedInUser; // final profile = await client.profile.me(); state = state.copyWith( user: user, ); } }
代码生成版本实现
1. 配置依赖
在pubspec.yaml中添加代码生成相关依赖:
dependencies: flutter: sdk: flutter riverpod: ^2.3.0 riverpod_annotation: ^2.1.1 dev_dependencies: build_runner: ^2.4.4 riverpod_generator: ^2.2.3
2. 改写为代码生成格式的Provider
创建session_provider.dart文件,内容如下:
import 'package:riverpod_annotation/riverpod_annotation.dart'; // 导入你的Session和ApiClient类 import 'your_import_path.dart'; part 'session_provider.g.dart'; @riverpod class SessionProvider extends _$SessionProvider { @override Session build() { // 原构造函数的初始化逻辑移至build方法 updateUser(); // 返回初始状态,对应原代码的initial参数 return Session(); // 替换为你的实际初始Session实例 } void updateUser() async { // 统一获取ApiClient实例,避免重复调用singleton final apiClient = singleton<ApiClient>(); final user = apiClient.sessionManager.signedInUser; // 异步接口可直接在这里await执行 // final profile = await apiClient.client.profile.me(); state = state.copyWith(user: user); } }
3. 生成代码
在终端执行以下命令生成对应的.g文件:
dart run build_runner build
或使用watch模式实时生成:
dart run build_runner watch
关键注意点
- 代码生成模式下无需手动写StateNotifier构造函数,
build()方法承担初始化状态和启动逻辑的职责 - 原代码中的
Ref已自动注入,可直接在类内使用ref(比如ref.watch()其他Provider) - 若ApiClient是通过Riverpod提供的,建议将
singleton<ApiClient>()替换为ref.watch(apiClientProvider),降低耦合 - 异步操作可直接在
updateUser()中执行,StateNotifier会自动处理状态更新
内容的提问来源于stack exchange,提问作者Bryan Bombardier
相关产品推荐
相关产品推荐

