在前面,我已经使用了这个函数:

override fun getAuthResponse() = callbackFlow  {
    val listener = AuthStateListener {
        trySend(it.currentUser == null)
    }
    auth.addAuthStateListener(listener)
    awaitClose {
        auth.removeAuthStateListener(listener)
    }
}

但由于解释的一些限制,我不得不使用:

override fun getAuthResponse(): StateFlow<Boolean> {
    val flow = MutableStateFlow(auth.currentUser == null)
    val listener = AuthStateListener {
        flow.value = it.currentUser == null
    }
    auth.addAuthStateListener(listener)
    return flow
}

这就是我所需要的,但我找不到waitClose{...},因此我可以删除侦听器.如何在使用StateFlow时删除监听器?

推荐答案

您可以使用带有stateIn的回调流将其转换为StateFlow,该StateFlow仅在侦听器具有收集器时才使用该侦听器.当失go 所有收集器时,WhileSubscried会导致upstream 回调流终止,因此它将删除监听器.当它获得新的First收集器时,它会从头开始重新启动upstream 流.

要使用stateIn,您必须有一个可用来运行状态流转换的协程作用域.我只是在本例中使用GlobalScope.如果这是在ViewModel中,您可能希望改用viewModelScope.或者,您可以将协程作用域作为函数的输入参数.我认为由于使用了WhileSubscribed(),GlobalScope可能还可以.

override fun getAuthResponse(): StateFlow<Boolean> = callbackFlow  {
    send(it.currentUser == null)
    val listener = AuthStateListener {
        trySend(it.currentUser == null)
    }
    auth.addAuthStateListener(listener)
    awaitClose {
        auth.removeAuthStateListener(listener)
    }
}.stateIn(GlobalScope, SharingStarted.WhileSubscribed(), auth.currentUser == null)

Kotlin相关问答推荐

如何在Kotlin中模拟www.example.com()?

Kotlin 海峡没有结束

Kotlin扩展函数未调用Hibernate/JPA中的重写函数

如何在操作系统版本上正确获取Room数据库的路径>;=26 sdk?

列表在 android WebView 中没有正确迭代

如何避免键盘打开时jetpack compose 内容上升

Spring webflux bean验证不起作用

如何创建 Kotlin DSL - DSL 语法 Kotlin

如何在主线程上使用 Kotlin 协程 await()

如何在 Kotlin 中为变量设置监听器

Kotlin get字段注释始终为空

Kotlin - 来自 KType 的 KClass<*>

如何在使用 Gradle 的 AppEngine 项目中使用 Kotlin

Kotlin协程处理错误和实现

将ExpectedException与Kotlin一起使用

如何使用mockk库模拟android上下文

Failure delivering result on activity result

Android studio 4.0 新更新版本说 Kotlin 与这个新版本不兼容

将 androidx.constraintlayout:constraintlayout lib 更新到 2.0.2 版本后出现崩溃 isRtl () null 引用

如何在伴随对象中使用泛型