从 backstack 弹出另一个可组合后手动(重新)触发 ViewModel 函数

时间:2021-07-26 14:31:48

标签: android kotlin mvvm android-jetpack-compose android-viewmodel

我有以下流程:当应用程序启动时,会显示一个包含热门项目的屏幕。用户登录,成功登录后,返回堆栈被弹出,用户返回到带有热门项目的屏幕。但是在登录时,用户最后喜欢/看过的项目也应该显示出来。

在非 Compose 中,我只需重新触发 viewModel 中获取所有项目的函数。但是在 Compose 中,如果我尝试从 Composable 调用函数,我最终会陷入无限循环。

我的问题是 - 在用户从成功登录返回到开始屏幕后,如何重新加载项目?在这种情况下,最佳实践是什么?

视图模型

private val _itemsFlow = MutableStateFlow(emptyList())
val itemsFlow: StateFlow<List<Item>> = _itemsFlow

init {
   getItems()
}

private fun getItems() {
   viewModelScope.launch {
      itemRepository.getItems().collect { items ->
         _itemsFlow.value = items
      }
   }
}

可组合

@Composable
fun Home(viewModel: HomeViewModel = hiltViewModel()) {
   val items by viewModel.itemsFlow.collectAsState()
   ...
   // used later in a LazyRow
}

1 个答案:

答案 0 :(得分:1)

查看side-effects

在你的情况下,这样的事情会有所帮助:

LaunchedEffect(Unit) {
    viewModel.getItems()
}