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

Flutter Clean架构下retrofit结合injectable注入问题解决方案

Flutter 中 Retrofit 结合 Injectable 注入的标准实现方案

不要修改任何build_runner自动生成的代码文件,所有生成类的依赖绑定统一通过 Injectable 提供的@module机制实现,这也是适配 Clean Architecture 分层规则的标准做法,具体步骤如下:

  • 新建依赖注入模块文件,例如路径lib/di/network_module.dart,在类上添加@module注解标记为注入配置模块,所有网络相关的第三方依赖、生成类依赖都在这个类里统一注册。
  • 在模块中提前注册Dio实例(如果已经在其他模块注册过Dio可跳过这步),再通过Retrofit抽象类自带的工厂构造函数生成客户端实例,添加单例/懒加载单例注解标记为可注入对象。示例代码如下:
import 'package:injectable/injectable.dart';
import 'package:dio/dio.dart';
// 导入自定义的Retrofit抽象客户端类,无需导入build生成的实现类文件
import 'package:your_project/features/xxx/data/datasource/app_api_client.dart';

@module
abstract class NetworkModule {
  // 注册Dio实例,可按需添加拦截器、超时配置、证书校验等逻辑
  @lazySingleton
  Dio get dio => Dio(
    BaseOptions(
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 15),
    )
  );

  // 注册Retrofit客户端,返回类型为自定义的抽象类,注入时会自动按类型匹配
  @lazySingleton
  AppApiClient get appApiClient => AppApiClient(dio);
}
  • 配置完成后,重新执行build_runner命令生成依赖注入注册代码即可,后续不管是重新生成Retrofit代码还是重新生成注入代码,这套配置都不会被覆盖:
    flutter pub run build_runner build --delete-conflicting-outputs

这种实现完全符合Clean Architecture的依赖规则:仓库层依赖的是抽象的Api客户端契约,具体实现(build生成的Retrofit实现类)的构造、绑定逻辑全部放在外层的依赖注入层完成,不需要侵入生成代码,也不需要修改抽象类的原有逻辑。如果需要多环境配置不同baseUrl、或者给不同接口客户端配置不同的Dio实例,直接在模块方法里传参调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:57:22