从后台弹出另一个 Composable 后手动(重新)触发 ViewModel 函数
Manually (re)trigger ViewModel function after popping another Composable from the backstack
我有以下流程:当应用程序启动时,会显示一个包含热门项目的屏幕。用户登录,成功登录后会弹出后台堆栈,用户 returns 会进入显示热门项目的屏幕。但是登录后,用户liked/looked最后的项目也应该显示出来。
在非 Compose 中,我只是重新触发 viewModel 中获取所有项目的函数。但是在 Compose 中,如果我试图从 Composable 调用函数,我将陷入无限循环。
我的问题是 - 如何在用户 returns 成功登录到开始屏幕后重新加载项目?在这种情况下,最佳做法是什么?
ViewModel
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
}
对于你的情况,这样的事情会有所帮助:
LaunchedEffect(Unit) {
viewModel.getItems()
}
我有以下流程:当应用程序启动时,会显示一个包含热门项目的屏幕。用户登录,成功登录后会弹出后台堆栈,用户 returns 会进入显示热门项目的屏幕。但是登录后,用户liked/looked最后的项目也应该显示出来。
在非 Compose 中,我只是重新触发 viewModel 中获取所有项目的函数。但是在 Compose 中,如果我试图从 Composable 调用函数,我将陷入无限循环。
我的问题是 - 如何在用户 returns 成功登录到开始屏幕后重新加载项目?在这种情况下,最佳做法是什么?
ViewModel
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
}
对于你的情况,这样的事情会有所帮助:
LaunchedEffect(Unit) {
viewModel.getItems()
}