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

