我在谷歌的撰写文档(链接)中看到,
有一个LoginScreenCompose函数,基于一个动作(例如,这里,成功登录),我们希望然后使用lambda函数从LoginScreen的输入导航到HomeScreen,
在Google文档的例子中,他们记住了LoginScreen rememberUpdatedState()
输入的lambda函数,当成功登录时,rememberUpdatedState()
的值用于导航。
@Composable
fun LoginScreen(
onUserLogIn: () -> Unit, // Caller navigates to the right screen
viewModel: LoginViewModel = viewModel()
) {
Button(
onClick = {
// ViewModel validation is triggered
viewModel.login()
}
) {
Text("Log in")
}
// Rest of the UI
val lifecycle = LocalLifecycleOwner.current.lifecycle
val currentOnUserLogIn by rememberUpdatedState(onUserLogIn)
LaunchedEffect(viewModel, lifecycle) {
// Whenever the uiState changes, check if the user is logged in and
// call the `onUserLogin` event when `lifecycle` is at least STARTED
snapshotFlow { viewModel.uiState }
.filter { it.isUserLoggedIn }
.flowWithLifecycle(lifecycle)
.collect {
currentOnUserLogIn()
}
}
}
字符串
我知道rememberUpdatedState()
的用法,用于记住一个值并获取最新的值。
但是这个结构的用法是从一个rememberedUpdateState非直接调用lambda函数(onUserLogIn()
),
为什么不直接调用onUserLogIn lambda函数呢?
1条答案
按热度按时间5kgi1eie1#
这就是
rememberUpdatedState
的作用--将更新的状态传递到LaunchedEffect
中。如果直接调用onUserLogIn
,它将使用LaunchedEffect
启动时的初始值。