Jetpack组成MuableSharedFlow一次拍摄事件 [英] Jetpack Compose MutableSharedFlow one shot events
本文介绍了Jetpack组成MuableSharedFlow一次拍摄事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我的视图模型中,我有一个向服务器发送登录请求的函数,如果成功,我想更新SharedFlow,并使用此触发器导航到另一个屏幕
class loginViewModel: ViewModel() {
private val _authToken = MutableSharedFlow<AuthToken>()
val authToken: SharedFlow<AuthToken> = _authToken
fun login() {
...loginRequest
.onSuccess {
_authToken.emit(value)}
}
在我的导航图表中,我这样设置了视图模型
private fun NavGraphBuilder.addLogin(navController: NavController) {
composable(AuthenticationScreens.Login.route) {
val loginViewModel: LoginViewModel = hiltViewModel()
val authToken by loginViewModel.authToken.collectAsState()
LoginScreen(
authToken = authToken,
viewModel = loginViewModel,
navigateToDashboard= {
navController.navigate(Dashboard.Dashboard.route)
}
)
}
}
然后我在登录屏幕中执行if检查,以便在SharedFlow更新时导航到另一个屏幕
@Composable
fun LoginScreen(
authToken: AuthToken,
viewModel: LoginViewModel,
navigateToDashboard: () -> Unit) {
if (authToken.isNotBlank()) {
navigateToDashboard()}
}
代码会触发,但即使当我导航到下一个屏幕时也会不断调用,导致大量闪烁和糟糕的UI。有没有其他方法来处理这样的导航事件,或者有什么方法可以让Composable在需要时只读取值一次?
推荐答案
所以我想出了一种方法,但我仍然觉得这不完全正确,我在导航后将共享流设置回其默认状态。如果有人有更简洁的方法,请让我知道
LaunchedEffect(key1 = authToken) {
if (authToken.token?.isNotBlank()) {
navigateDashboard()
viewModel._authToken.emit(AuthToken("", 0))
}
}
这篇关于Jetpack组成MuableSharedFlow一次拍摄事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文