Jetpack Compose中Hilt ViewModel结合AssistedInject报错求助
解决Hilt ViewModel AssistedInject构建错误的方案
1. 确保依赖配置正确
先检查Gradle依赖,确保包含Hilt核心、AssistedInject及Hilt Compose导航的依赖(版本保持一致,建议用最新稳定版):
// Hilt核心 implementation "com.google.dagger:hilt-android:2.48" kapt "com.google.dagger:hilt-android-compiler:2.48" // AssistedInject依赖 implementation "com.google.dagger:assisted-inject:2.48" kapt "com.google.dagger:assisted-inject-compiler:2.48" // Hilt Compose导航(适配Compose场景) implementation "androidx.hilt:hilt-navigation-compose:1.1.0"
2. 正确编写ViewModel与AssistedFactory
ViewModel需用@HiltViewModel注解,构造函数标记@Inject,运行时参数用@Assisted注解;同时在ViewModel内部定义@AssistedFactory接口,并提供ViewModelProvider.Factory的包装方法:
@HiltViewModel class MyViewModel @Inject constructor( @Assisted val someId: Int? ) : ViewModel() { // 业务逻辑实现... // 定义AssistedFactory接口 @AssistedFactory interface Factory { fun create(someId: Int?): MyViewModel } // 包装成ViewModelProvider.Factory供Composable调用 companion object { fun provideFactory( factory: Factory, someId: Int? ): ViewModelProvider.Factory = object : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T : ViewModel> create(modelClass: Class<T>): T { return factory.create(someId) as T } } } }
3. 在Composable中正确获取ViewModel
使用hiltViewModel的重载方法,传入lambda将AssistedFactory转换为ViewModelProvider.Factory:
val viewModel: MyViewModel = hiltViewModel { factory -> MyViewModel.provideFactory(factory as MyViewModel.Factory, myIdVariable) }
错误原因分析
你之前的尝试存在核心问题:
- 第一次/第四次错误:
@HiltViewModel注解的ViewModel构造函数必须用@Inject,不能用@AssistedInject,后者仅适用于普通类的辅助注入场景。 - 第二次/第三次错误:AssistedFactory需要绑定到ViewModel的
@Inject构造函数中的@Assisted参数,但你缺少将Factory包装为ViewModelProvider.Factory的关键步骤,且可能存在依赖配置缺失(比如未添加AssistedInject的编译器依赖)。
内容的提问来源于stack exchange,提问作者Arman TabibZadeh
相关产品推荐
相关产品推荐

