撰写中的条件导航,无需点击

conditional navigation in compose, without click

我正在撰写屏幕,在应用程序打开时,我将用户重定向到个人资料页面。如果配置文件完整,则重定向到用户列表页面。

我的代码如下

@Composable
fun UserProfile(navigateToProviderList: () -> Unit) {

val viewModel: MainActivityViewModel = viewModel()

if(viewModel.userProfileComplete == true) {
    navigateToProviderList()
    return
}

else {
  //compose elements here
}

}

但是应用程序在闪烁,登录后,我可以看到它一次又一次地调用上述重定向条件。在浏览文档时,它提到我们应该只通过回调进行导航。我该如何处理这种情况?我这里没有 onCLick 条件。

可组合函数内容可多次调用

如果您需要在可组合项中执行某些操作,则需要使用 side effects

在这种情况下 LaunchedEffect 应该有效:

LaunchedEffect(viewModel.userProfileComplete == true) {
    if(viewModel.userProfileComplete == true) {
        navigateToProviderList()
    }
}

在键中(LaunchedEffect 的第一个参数)你需要指定一些键。自上次重组以来,每次此密钥发生变化时,都会调用内部代码。你可以把 Unit 放在那里,在这种情况下它只会被调用一次,当视图出现在第一个地方时

LaunchedEffect 对我不起作用,因为我想在 UI 线程中使用它,但出于某种原因并非如此:/ 然而,这是我自己做的:

@Composable
fun <T> SelfDestructEvent(liveData: LiveData<T>, onEvent: (argument: T) -> Unit) {
    val previousState = remember { mutableStateOf(false) }
    val state by liveData.observeAsState(null)
    if (state != null && !previousState.value) {
        previousState.value = true
        onEvent.invoke(state!!)
    }
}

并且您可以像这样在任何其他可组合项中使用它:

SingleEvent(viewModel.someLiveData) {
        //your action with that data, whenever it was triggered, but only once
}