Koin注入Repository依赖报错,同一Repository在不同Interceptor中注入异常
Koin 依赖解析失败排查步骤
- 确认模块加载顺序
首先检查你启动Koin时modules()方法传入的模块顺序,必须保证提供SharedPreferences的androidModule在networkModule之前加载。另外补充SharedPrefDataSource的Koin声明,确认它依赖的SharedPreferences能正常被解析。 - 排查循环依赖问题
这是OkHttp拦截器注入最常见的问题:你的OkHttpClient构建时需要注入AuthInterceptor,而AuthInterceptor依赖的TokenApi、UserRepository底层又依赖Retrofit实例,Retrofit的构建反过来需要OkHttpClient,形成循环依赖。
你可以打开modules.kt定位370、375行的代码,确认是否是OkHttpClient或者API服务的声明位置,即可验证循环依赖是否存在。 - 检查接口绑定声明
你贴出的代码中没有UserRepository接口的绑定配置,请确认你的Koin模块中存在如下声明:
如果缺少接口绑定,直接调用single<UserRepository> { UserRepositoryImpl(get(), get(), get()) }get<UserRepository>()就会抛出解析失败异常。 - 解决堆栈行号丢失问题
日志中Unknown Source:4是混淆导致的行号丢失,属于干扰信息,你可以临时关闭debug包的R8/ProGuard混淆,就能拿到真实的崩溃堆栈行号,准确定位异常位置。 - 开启Koin调试日志
初始化Koin时传入日志打印器,就能看到完整的依赖解析链路,直接定位缺失的依赖:startKoin { logger(PrintLogger(level = Level.DEBUG)) // 其他配置 }
常见解决方案
如果确认是循环依赖导致的问题,直接给拦截器的依赖加懒加载即可绕开初始化阶段的循环解析:
class AuthInterceptor constructor( private val tokenApi: Lazy<TokenApi>, private val prefData: Lazy<SharedPrefDataSource>, private val userRepository: Lazy<UserRepository> ) : Interceptor, CoroutineScope { // 用到依赖的时候直接取.value即可 }
对应Koin声明不需要改,直接传get()就可以自动注入Lazy实例。
内容的提问来源于stack exchange,提问作者This Stack Overflow Life
相关产品推荐
相关产品推荐

