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

