【问题标题】:ViewModel isActive stills true after route change in Jetpack Compose在 Jetpack Compose 中更改路由后,ViewModel isActive 仍然为真
【发布时间】: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


    【解决方案1】:

    一种选择是在 Home Composable 上使用 displosableEffect 来启动/停止视图模型代码:

    DisposableEffect(Unit) {
        homeViewModel.setIsActive(true)
        onDispose {
            homeViewModel.setIsActive(false)
        }
    }
    

    这需要将 viewModel 实例传递给组件,而不是像您现在所做的那样只传递状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2022-08-13
      • 2011-05-02
      • 2022-11-04
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多