撰写中的条件导航,无需点击
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
}
我正在撰写屏幕,在应用程序打开时,我将用户重定向到个人资料页面。如果配置文件完整,则重定向到用户列表页面。
我的代码如下
@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
}