Jetpack组成MuableSharedFlow一次拍摄事件 [英] Jetpack Compose MutableSharedFlow one shot events

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆