无法创建SewingViewModel实例,Android应用启动崩溃求助
解决无法创建SewingViewModel实例的崩溃问题
崩溃日志
FATAL EXCEPTION: main
Process: com.example.sewinglessons, PID: 10153
java.lang.RuntimeException: Cannot create an instance of class com.example.sewinglessons.SewingViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:204)
问题原因
- Hilt依赖注入配置不完整,导致系统无法通过DI创建带
@HiltViewModel注解的ViewModel实例 - Compose中使用默认的
viewModel()方法获取ViewModel,无法识别Hilt的注入逻辑 - 预览函数直接调用无参的
HomeScreen(),缺少Hilt环境支撑
解决步骤
1. 补全Hilt基础配置
- 项目级build.gradle添加Hilt插件依赖:
plugins { id 'com.android.application' version '你的版本号' apply false id 'com.google.dagger.hilt.android' version '2.48' apply false }
- 模块级build.gradle添加Hilt依赖与插件:
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'dagger.hilt.android.plugin' } dependencies { // Hilt核心依赖 implementation 'com.google.dagger:hilt-android:2.48' kapt 'com.google.dagger:hilt-android-compiler:2.48' // Hilt ViewModel支持 implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03' kapt 'androidx.hilt:hilt-compiler:1.0.0' // Compose Hilt导航支持 implementation 'androidx.hilt:hilt-navigation-compose:1.0.0' }
- 自定义Application类并添加
@HiltAndroidApp注解:
@HiltAndroidApp class SewingApplication : Application() {}
- 在
AndroidManifest.xml中指定该Application:
<application android:name=".SewingApplication" ...> </application>
2. 修改Compose中ViewModel的获取方式
在HomeScreen中用hiltViewModel()替换默认的viewModel()方法:
// 导入hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( homeViewModel: HomeViewModel = hiltViewModel(), sewingViewModel: SewingViewModel = hiltViewModel() ) { // 原有UI逻辑保持不变 }
3. 确保UseCase类可被Hilt注入
检查GetPatternsUseCase和GetPatternByIdUseCase的构造函数是否添加@Inject注解:
class GetPatternsUseCase @Inject constructor( private val patternRepository: PatternRepository ) { suspend operator fun invoke(): List<SewingItem> { // 业务逻辑实现 } }
4. 修复预览函数
预览环境没有Hilt支持,需要传入模拟的ViewModel实例:
@Preview @Composable fun HomeScreenPreview() { val mockHomeViewModel = HomeViewModel() // 假设HomeViewModel有默认构造 val mockSewingViewModel = object : SewingViewModel( getPatternsUseCase = { emptyList() }, getPatternByIdUseCase = { _ -> null } ) {} HomeScreen(homeViewModel = mockHomeViewModel, sewingViewModel = mockSewingViewModel) }
内容的提问来源于stack exchange,提问作者Niko_Niko
相关产品推荐
相关产品推荐

