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

Flutter无ref时如何在类内获取Riverpod的Dio Provider值?

解决方法

你不需要在无ref的场景下获取Dio Provider,正确的做法是在ApiService的build方法中利用内置的ref读取Dio实例,将其保存为类的成员变量,后续方法直接调用该变量即可。

修改后的ApiService代码如下:

@Riverpod(keepAlive: true)
class ApiService extends _$ApiService {
  static const basePath = "/whseactivity";
  late Dio _dio; // 声明成员变量存储Dio实例

  @override
  ApiService build() {
    // 在build方法中通过ref读取Dio Provider并持久化
    _dio = ref.watch(dioProvider);
    return this; // 返回当前实例,而非手动新建ApiService
  }

  Future<AllData> getAllData(DateTime date, String whseId) async {
    String endpoint = "$basePath/GetDoorsActions?Date=$date&WhID=$whseId";
    // 直接使用保存的_dio实例发起请求
    final response = await _dio.get(endpoint);
    final json = response.data! as Map<String, dynamic>;

    return AllData.fromJson(json);
  }
}

关键说明:

  • Riverpod的Notifier类(即这里的_$ApiService)在build方法中天然提供ref对象,可直接用来获取所需的Provider实例。
  • 将Dio实例保存为类成员后,getAllData等业务方法无需再处理ref相关逻辑,直接调用变量即可。
  • 原代码中build方法返回ApiService()是错误的,应返回this——Riverpod会负责创建和管理ApiService的实例,手动新建会导致成员变量无法被正确初始化。

内容的提问来源于stack exchange,提问作者Le Fernandé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:05:17