Android Kotlin中Dagger Hilt注入ViewModel实例创建失败问题
1. 修正ViewModel的注入注解与构造
确保WeatherViewModel的构造函数添加@Inject注解,让Hilt识别可注入的构造逻辑:
class WeatherViewModel @Inject constructor( private val weatherRepository: WeatherRepository // 示例依赖,根据实际调整 ) : ViewModel() { // 业务逻辑代码 }
禁止手动通过ViewModelProvider实例化ViewModel,必须使用Hilt提供的注入方式。
2. 确认Compose场景下的ViewModel获取方式
在MainScreen(Compose组件)中,必须用hiltViewModel()获取实例,不能直接new:
@Composable fun MainScreen( viewModel: WeatherViewModel = hiltViewModel() // 正确注入方式 ) { // UI渲染代码 }
3. 补全Hilt基础配置
(1)Application类注解
你的Application类必须添加@HiltAndroidApp,作为Hilt的注入入口:
@HiltAndroidApp class MyApplication : Application() { // 初始化逻辑(如果有) }
同时在AndroidManifest.xml中指定该Application:
<application android:name=".MyApplication" <!-- 其他配置项 --> >
(2)Activity注解
MainActivity需要添加@AndroidEntryPoint,让Hilt能注入到Activity层级:
@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // 调用MainScreen } } }
4. 校验Build.gradle依赖配置
项目级配置(build.gradle/settings.gradle)
确保引入Hilt插件:
plugins { id 'com.google.dagger.hilt.android' version '2.44' apply false // 其他插件(Android、Kotlin等) }
模块级配置(build.gradle)
添加Hilt核心依赖、Compose集成依赖,并启用kapt:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'dagger.hilt.android.plugin' } android { buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion '1.4.3' // 需与Kotlin版本兼容 } } dependencies { // Hilt核心 implementation 'com.google.dagger:hilt-android:2.44' kapt 'com.google.dagger:hilt-android-compiler:2.44' // Compose与Hilt集成 implementation 'androidx.hilt:hilt-navigation-compose:1.0.0' // ViewModel依赖 implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1' } kapt { correctErrorTypes true }
注意:所有依赖版本需保持兼容(如Hilt版本、Kotlin版本、Compose编译器版本)。
5. 检查AppModule的依赖提供逻辑
如果WeatherViewModel依赖的类(如Repository)需要Hilt提供,确保AppModule配置正确:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Provides @Singleton fun provideWeatherRepository(): WeatherRepository { return WeatherRepositoryImpl() // 返回正确的实现类 } }
若依赖类本身有@Inject构造,则无需在Module中手动提供,Hilt会自动处理。
6. 根据Logcat子错误精准定位
崩溃日志的深层原因是关键,常见子错误及解决:
示例1:
Caused by: java.lang.InstantiationException: ... has no zero argument constructor
解决:给ViewModel添加@Inject构造,禁止用无参方式创建实例。
示例2:
Caused by: javax.inject.ProviderNotFoundException: No provider found for ...
解决:检查依赖类的@Inject注解或Module中的提供逻辑,确保Hilt能找到该类的实例。
内容的提问来源于stack exchange,提问作者ShahZaman Rai

