Jetpack Compose中使用@HiltViewModel导致应用崩溃求助
问题原因
崩溃的核心原因是:你给TaskViewModel加了@HiltViewModel注解,明确要通过Hilt依赖注入创建实例,但在Compose的TaskScreen中调用了默认的viewModel()方法——这个方法会尝试用无参构造函数创建ViewModel,而你的TaskViewModel只有带@Inject注解的带参构造函数,系统找不到对应构造方法,因此抛出NoSuchMethodException。
解决步骤
- 添加Hilt-Compose依赖
确保Module级别的build.gradle中添加了hilt与Compose集成的依赖:
dependencies { implementation "androidx.hilt:hilt-navigation-compose:1.1.0" // 同时确保已添加hilt-android、hilt-compiler等基础Hilt依赖 }
- 替换ViewModel获取方法
在TaskScreen中,将默认的viewModel()替换为Hilt提供的hiltViewModel():
@Composable fun TaskScreen(modifier: Modifier = Modifier, taskViewModel: TaskViewModel = hiltViewModel()) { val date = LocalDate.now() val tasks = taskViewModel.getLiveData(date = date).observeAsState() tasks.value?.let { items -> LazyColumn(modifier = modifier) { items(items) { task -> // ... 你的Item布局代码 } } } }
- 确保宿主组件启用Hilt
承载该Compose的Activity必须添加@AndroidEntryPoint注解,否则Hilt无法为ViewModel提供依赖上下文:
@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // ... 调用TaskScreen的代码 } } }
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

