【问题标题】:callbackFlow not returning anything android kotlincallbackFlow 不返回任何东西 android kotlin
【发布时间】:2020-05-08 05:40:25
【问题描述】:

我想用协程实现firebase实时数据库,所以我需要使用flow,因为firebase只接受回调。问题是 .collect{} 块永远不会被执行 这是我的代码

   @ExperimentalCoroutinesApi
override suspend fun getProduct(barcode: String): ProductItem? {
    return withContext(Dispatchers.Default) {
        println("Hi")
        var item: ProductItem? = null
        productFlow(barcode).collect {
        //this never gets called
            print("Getting product")
            item = it
        }
        println("Ending product request ${item?.name}")
        Log.i("GetProduct",item?.name)
        item
    }
}
@ExperimentalCoroutinesApi
private fun productFlow(barcode: String): Flow<ProductItem?> = callbackFlow {
    val database = FirebaseDatabase.getInstance()
    val productRef = database.getReference("products/$barcode")
    val callback = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            for(snapshot in dataSnapshot.children){

                Log.i("Source", snapshot.value.toString())
            }
            val product = dataSnapshot.getValue(ProductItem::class.java)
            Log.i("Source",product?.name) //everything is good until here

            sendBlocking(dataSnapshot.getValue(ProductItem::class.java)) //after this i dont get anything on the collect{} block
        }

        override fun onCancelled(databaseError: DatabaseError) {
            println("cancelling")
            sendBlocking(null)
        }
    }
    try {
        productRef.addListenerForSingleValueEvent(callback)
    } catch (e: FirebaseException) {
        println("Firebase exception")
        sendBlocking(null)
    }
    awaitClose{
        println("Closing")
        productRef.removeEventListener(callback)
    }
}

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    首先我建议使用catch 方法来检查是否有错误。其次,对于callbackflow,我记得使用offer()而不是sendBlocking

    【讨论】:

    • 我刚试了一下,它也不起作用,我也没有在新的 try catch 上遇到错误,所以我不知道 :(
    • 然后,你可以在 coroutines github 上打开一个问题:/
    • 现在我想起来了,因为您只有一个评估,对于您的情况,使用suspendCancelableCoroutine 而不是callbackFlow 可能更容易
    • 谢谢,我稍后再试,我今天早上通过在 sendBlocking 语句之后说 channel.close() 来修复它,因为 firebase 没有 onComplete 回调,我只需要检索一次。但我会尝试并回来
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多