【发布时间】:2020-09-12 15:22:04
【问题描述】:
在Flow<MyClass> 上调用collect 后,我正在尝试执行一些代码。我对使用 Flows 还是有点陌生,所以我不明白为什么函数后面的代码没有被调用。
我如何使用 Flow:
incidentListener = FirebaseUtils.databaseReference
.child(AppConstants.FIREBASE_PATH_AS)
.child(id)
.listen<MyClass>() //This returns a Flow<MyClass?>?
我如何使用 Flow:
private suspend fun myFun() {
viewmodel.getListener()?.collect { myClass->
//do something here
}
withContext(Dispatchers.Main) { updateUI() } //the code never reaches this part
}
myFun() 的调用方式:
CoroutineScope(Dispatchers.IO).launch {
myFun()
}
就我尝试使其工作而言,我尝试关闭协程上下文,但它没有工作。我假设 Flows 的工作方式与常规协程不同。
更新:
我正在使用这段代码通过 Firebase 进行监听。我不知道它是否会有所帮助,但也许是我实现它的方式导致了问题?
inline fun <reified T> Query.listen(): Flow<T?>? =
callbackFlow {
val valueListener = object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
close()
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
try {
val value = dataSnapshot.getValue(T::class.java)
offer(value)
} catch (exp: Exception) {
if (!isClosedForSend) offer(null)
}
}
}
addValueEventListener(valueListener)
awaitClose { removeEventListener(valueListener) }
}
【问题讨论】: