如何正确绑定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
相关产品推荐
相关产品推荐

