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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:42:20