【发布时间】:2023-02-10 09:06:12
【问题描述】:
我有一个具有底部导航的应用程序。它有一些选项卡,现在,从选项卡 A 我有一个代码,每 5 秒更新一次视图中的值。
当我切换到选项卡 B 时,我希望与路由 A 关联的视图模型的范围不再处于活动状态以继续执行代码,尽管我希望视图模型能够存活下来,因为在选项卡上没有删除它的感觉改变。
我当前的代码
导航图
NavHost(navController, startDestination = BottomNavItem.HomeScreen.screen_route) {
composable(BottomNavItem.HomeScreen.screen_route) {
val homeViewModel: HomeViewModel = hiltViewModel()
val homeUiState = homeViewModel.uiState.collectAsState()
HomeScreen(uiState = homeUiState.value)
}
composable(BottomNavItem.FiatToCryptoScreen.screen_route) {
val viewModel: CryptoToFiatViewModel = hiltViewModel()
val uiState = viewModel.uiState.collectAsState()
CryptoToFiatScreen(uiState = uiState.value)
}
}
现在,主屏幕需要主页视图模型,在 init 块中,它会每 5 秒发出一次请求,以获取硬币的最新结果
@HiltViewModel
class HomeViewModel @Inject constructor(private val repo: HomeRepository) : ViewModel() {
init {
updateFeaturedCoin()
}
private fun updateFeaturedCoin() {
viewModelScope.launch {
while (isActive) {
val featuredCoinPrice = repo.getTickerForCoin("BTC")
if (featuredCoinPrice.isSuccess) {
homeScreenState.update {
it.copy(
isLoading = false,
featuredCoinPrice = featuredCoinPrice.getOrNull()?.price
)
}
}
delay(5000)
}
}
}
....
}
现在,这工作正常,我的问题是当我更改标签时,比方说,去CryptoTofiat屏幕,如果我在活跃条件,这永远不会是假的,如果我移动到另一个选项卡,我需要这个 cicle 停止执行,因为现在主页视图模型不再在前台更新其视图。
我怎么知道主页视图模型如果我切换到路线中的另一个可组合项,它不再处于活动状态?
我认为将 viewmodel 的范围限定到它的路线将触发一个事件,告诉 viewmodel 在我更改路线时不再处于活动状态。
【问题讨论】:
标签: android kotlin android-jetpack-compose jetpack-compose-navigation