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

使用Navigation+Compose+HiltViewModel()导致崩溃问题求助

问题场景

在使用Navigation + Compose + Hilt时,将hiltViewModel()作为Screen构造函数的默认参数会导致程序崩溃,移除相关代码后运行正常。尝试过更换不同Compose版本未解决,且不想手动创建ViewModel实例。

问题原因

hiltViewModel()需要绑定到Navigation的NavBackStackEntry作为ViewModelStoreOwner,但如果将其作为HomeScreen的默认参数,初始化时机是在HomeScreen被调用时,此时尚未进入对应导航栈条目的上下文,无法获取正确的ViewModelStoreOwner,进而引发崩溃。

解决方案

1. 在导航的composable块内获取ViewModel并传递

正确的做法是在NavHost的composable lambda中调用hiltViewModel(),因为该lambda提供了当前导航栈条目NavBackStackEntry,能确保ViewModel绑定到正确的导航上下文。修改代码如下:

修改SetupNavGraph中的composable部分:

composable(route = Screen.Home.route) { backStackEntry ->
    // 在导航条目上下文内获取ViewModel
    val viewModel: HomeViewModel = hiltViewModel(backStackEntry)
    HomeScreen(navController = navController, viewModel = viewModel)
}

对应的HomeScreen可以简化(推荐显式传递以避免上下文问题):

@Composable
fun HomeScreen(
    navController: NavHostController,
    viewModel: HomeViewModel // 移除默认参数,强制外部传入
) {
    // ...屏幕逻辑
}

2. 检查Hilt配置完整性

确保以下配置正确:

  • 承载Compose的Activity添加@AndroidEntryPoint注解:
    @AndroidEntryPoint
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                MovieAppTheme {
                    // ...你的主题和导航代码
                }
            }
        }
    }
    
  • HomeViewModel添加@HiltViewModel注解并通过构造函数注入依赖:
    @HiltViewModel
    class HomeViewModel @Inject constructor(
        // 注入所需依赖,比如Repository等
    ) : ViewModel() {
        // ...ViewModel逻辑
    }
    
  • 确保引入了正确的Hilt导航Compose依赖(版本需与Hilt、Compose兼容):
    implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
    

内容的提问来源于stack exchange,提问作者shiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:15:59