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

如何正确绑定Compose屏幕与ViewModel?含Hilt及无依赖实现

Compose导航中绑定ViewModel的正确方式

无依赖注入的实现

在Compose的NavHost每个composable块内,使用viewModel()函数创建对应ViewModel即可。这个函数会自动将ViewModel的生命周期与当前导航目的地绑定——进入该页面时创建,页面被弹出导航栈时销毁,和Fragment架构下的ViewModel生命周期完全一致。

代码示例:

NavHost(navController, startDestination = NavigationItem.Home.route) {
    composable(NavigationItem.Home.route) {
        val homeViewModel: HomeViewModel = viewModel()
        HomeScreen(viewModel = homeViewModel)
    }
    composable(NavigationItem.History.route) {
        val historyViewModel: HistoryViewModel = viewModel()
        HistoryScreen(viewModel = historyViewModel)
    }
    composable(NavigationItem.Profile.route) {
        val profileViewModel: ProfileViewModel = viewModel()
        ProfileScreen(viewModel = profileViewModel)
    }
}

使用Hilt的实现

第一步:给ViewModel添加Hilt注解

给每个ViewModel加上@HiltViewModel注解,并通过构造函数注入所需依赖:

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val homeRepository: HomeRepository // 示例依赖
) : ViewModel() {
    // 业务逻辑
}

第二步:在导航中获取Hilt注入的ViewModel

在composable块内使用hiltViewModel()函数获取ViewModel,它会自动处理依赖注入,同时保持与导航目的地一致的生命周期:

NavHost(navController, startDestination = NavigationItem.Home.route) {
    composable(NavigationItem.Home.route) {
        val homeViewModel: HomeViewModel = hiltViewModel()
        HomeScreen(viewModel = homeViewModel)
    }
    composable(NavigationItem.History.route) {
        val historyViewModel: HistoryViewModel = hiltViewModel()
        HistoryScreen(viewModel = historyViewModel)
    }
    composable(NavigationItem.Profile.route) {
        val profileViewModel: ProfileViewModel = hiltViewModel()
        ProfileScreen(viewModel = profileViewModel)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:12