多模块Jetpack Compose中Hilt辅助注入问题求助
解决多模块Jetpack Compose中Hilt辅助注入的循环依赖与类型转换问题
核心问题拆解
- 跨模块EntryPoint访问引发循环依赖:app模块的
ViewModelFactoryProvider定义在MainActivity中,若feature模块直接引用会打破「app依赖feature」的正常模块依赖链,导致循环依赖 - 类型转换错误:直接调用
NoteDetailViewModel.Factory获取实例时,拿到的是Hilt生成的单例代理类,无法直接转换为ViewModel实例,本质是工厂获取方式错误
分步解决方案
1. 把EntryPoint抽离到独立基础模块
创建一个core-di基础模块(或复用现有基础模块),将EntryPoint接口放在这里,让app和feature模块都依赖该基础模块,彻底避免循环依赖:
// core-di模块代码 @EntryPoint @InstallIn(SingletonComponent::class) interface ViewModelFactoryProvider { fun noteDetailViewModelFactory(): NoteDetailViewModel.Factory }
2. 在Feature模块中正确获取工厂实例
在feature模块的Composable里,通过EntryPointAccessors从Application级别获取工厂,无需依赖app模块的具体类:
// feature模块的Composable函数内 val factory = EntryPointAccessors.fromApplication( LocalContext.current.applicationContext, ViewModelFactoryProvider::class.java ).noteDetailViewModelFactory() // 用工厂创建带辅助参数的ViewModel val viewModel = viewModel { factory.create(noteId = "你的笔记ID参数") }
3. 检查ViewModel与Factory的注解规范
确保NoteDetailViewModel的注解配置完全符合AssistedInject要求:
// feature模块的ViewModel代码 class NoteDetailViewModel @AssistedInject constructor( private val noteRepo: NoteRepository, @Assisted private val noteId: String ) : ViewModel() { @AssistedFactory interface Factory { fun create(noteId: String): NoteDetailViewModel } }
4. 确认模块依赖关系
保持正确的依赖链:app模块依赖feature模块,app和feature模块同时依赖core-di模块,禁止feature模块反向依赖app模块。
错误原因复盘
- 把EntryPoint放在app模块的MainActivity中,feature模块无法合法引用(违背模块依赖方向)
- 直接调用
NoteDetailViewModel.Factory时,没有通过Hilt的EntryPoint机制获取真正的工厂实例,导致拿到的是Hilt生成的代理单例,无法转换为ViewModel类型
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

