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

Flutter中如何通过Injectable解析依赖包中的Dio实例

基于Injectable实现Dio依赖的注册与解析方案

首先确保你的项目已经在pubspec.yaml中引入了injectable、injectable_generator、build_runner、dio相关依赖,并且完成了Injectable的基础初始化配置。


1. 注册第三方Dio实例

由于Dio属于第三方库的类,无法直接添加@injectable注解,需要通过@module模块类注册自定义的Dio实例:

import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';

@module
abstract class AppInjectModule {
  // 可根据需求选择注册为单例@singleton,或者每次调用生成新实例的@provide
  @singleton
  Dio provideDio() {
    // 可在此处自定义Dio的全局配置、拦截器等逻辑
    final dio = Dio(
      BaseOptions(
        baseUrl: "https://你的业务接口基础地址",
        connectTimeout: Duration(seconds: 15),
        receiveTimeout: Duration(seconds: 15),
      ),
    );
    // 示例:添加日志拦截器
    // dio.interceptors.add(LogInterceptor(responseBody: true, requestBody: true));
    return dio;
  }

  // 若需要多个不同配置的Dio实例,可通过@Named注解区分
  @singleton
  @Named("uploadDio")
  Dio provideUploadDio() {
    return Dio(
      BaseOptions(
        baseUrl: "https://你的文件上传服务地址",
        sendTimeout: Duration(seconds: 30),
      ),
    );
  }
}

2. 生成注入代码

运行构建命令生成对应的注入逻辑代码:

flutter packages pub run build_runner build --delete-conflicting-outputs

每次修改注入配置后都需要重新运行该命令。

3. 业务类中注入解析Dio

单Dio实例场景

直接在标注了@injectable的业务类构造方法中声明Dio参数即可自动完成注入:

@injectable
class UserApiService {
  final Dio dio;

  // 无需手动实例化Dio,Injectable会自动注入你注册的实例
  const UserApiService(this.dio);

  Future<void> fetchUserInfo() async {
    final res = await dio.get("/user/info");
    // 处理业务逻辑
  }
}

多命名Dio实例场景

通过@Named注解指定要注入的实例即可:

@injectable
class FileUploadService {
  final Dio uploadDio;

  const FileUploadService(@Named("uploadDio") this.uploadDio);

  Future<void> uploadFile(String filePath) async {
    final res = await uploadDio.post("/file/upload", data: FormData.fromMap({
      "file": await MultipartFile.fromFile(filePath)
    }));
  }
}

4. 调用验证

在完成Injectable全局初始化后,直接获取业务类实例即可使用,内部Dio已经完成自动注入:

// main函数中完成Injectable初始化
final getIt = GetIt.instance;
configureDependencies(getIt);

// 直接获取业务实例,无需手动传入Dio
final userApi = getIt<UserApiService>();
// 也可以直接获取Dio实例使用
final commonDio = getIt<Dio>();

内容的提问来源于stack exchange,提问作者reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:09:02