【问题标题】:Jetpack Compose MutableSharedFlow one shot eventsJetpack Compose MutableSharedFlow 一次性事件
【发布时间】:2021-07-23 08:10:57
【问题描述】:

在我的视图模型中,我有一个向服务器发送登录请求的功能,成功后我想更新 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)
        }
    )

  }
}

然后,当 SharedFlow 更新时,我会在我的登录屏幕中进行 if 检查以导航到另一个屏幕

@Composable
fun LoginScreen(
authToken: AuthToken,
viewModel: LoginViewModel,
navigateToDashboard: () -> Unit) {

if (authToken.isNotBlank()) {
navigateToDashboard()}
}

代码会触发,但即使在我导航到下一个屏幕时也会不断调用,从而导致大量闪烁和糟糕的 UI。有没有一种不同的方式我应该处理这样的导航事件,或者有一种方式让可组合只在需要时读取一次值?

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    所以我想出了一种方法来做到这一点,但我仍然觉得这并不完全正确,我在导航后将共享流设置回它的默认状态。如果有人有更简洁的方法,请告诉我

      LaunchedEffect(key1 = authToken) {
        if (authToken.token?.isNotBlank()) {
            navigateDashboard()
            viewModel._authToken.emit(AuthToken("", 0))
        }
    }
    

    【讨论】:

    • 您是否发现这是一种消耗单次(热流)事件的可靠方法?
    猜你喜欢
    • 2022-10-20
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 2022-07-01
    • 2023-01-13
    • 2021-01-05
    相关资源
    最近更新 更多