You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法创建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)

问题原因

  1. Hilt依赖注入配置不完整,导致系统无法通过DI创建带@HiltViewModel注解的ViewModel实例
  2. Compose中使用默认的viewModel()方法获取ViewModel,无法识别Hilt的注入逻辑
  3. 预览函数直接调用无参的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:42:42