Firebase完成回调在Kotlin中如何工作

时间:2018-06-26 12:28:40

标签: android firebase firebase-realtime-database kotlin

我已经成功地从Firebase中读取了数据,并使用完成回调异步地将其显示在imageView中。作为编程新手,我仍然很难理解有关回调的一些机制,并希望有人会为我的某些问题提供一些启发。我已经阅读并观看了多个教程和解释,但是仍然难以理解某些概念。这是我的Firebase代码:

第1部分:

readFirebaseData(object: FirebaseCallback{
        override fun onCallback(list: MutableList<RecipeTemplate>) {

            glideVariable?.loadImageUrl(recipeArray[1].recipeImage) //WORKS!!
        }
})

第2部分:

fun readFirebaseData(firebaseCallback: FirebaseCallback) {
    ref!!.addValueEventListener(object: ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot?) {

            for (item in snapshot!!.children) {
                var tempRecipe = RecipeTemplate()
                val image = item.child("recipeImageFirebase")

                tempRecipe.recipeImage = image.value.toString()
                recipeArray.add(tempRecipe)
            }
            //INSERTING CODE HERE AT LATER STAGE... SEE LATER IN POST
            firebaseCallback.onCallback(recipeArray)

        }//END ON DATA CHANGE METHOD
    }) //END FB
}//END READ DATA

第3部分:

interface FirebaseCallback {
    fun onCallback(list: MutableList<RecipeTemplate>)
}

主要是我不了解界面的要点以及整个替代功能部分(PART 1)。事实是,仅在Firebase代码末尾使用函数调用,我就成功地完成了同样的事情。它所需的代码更少,并且易于理解和理解,并且据我所知,它具有相同的作用。看起来像这样:

第2部分内部:

test(recipeArray) //SIMPLY CALLING A FUNCTION INSTEAD OF THE CODE PREVIOUSLY USED.
//firebaseCallback.onCallback(recipeArray)

然后测试功能本身:

 fun test(list: MutableList<RecipeTemplate>) {
    Log.d("TAGM", "DONE WITH FB")
    glideVariable?.loadImageUrl(recipeArray[3].recipeImage)    
}

那么,我在这里想念什么?为什么要使用整个界面回调呢?

1 个答案:

答案 0 :(得分:0)

要解决此问题,您需要创建自己的回调以等待Firebase返回数据。为此,首先需要创建一个interface,如下所示:

interface FirebaseCallback {
    fun onCallback(list: MutableList<RecipeTemplate>)
}

然后,您需要创建一个实际上从数据库获取数据的函数。此函数应如下所示:

fun readFirebaseData(firebaseCallback: FirebaseCallback) {
    ref.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            val list = ArrayList<RecipeTemplate>()
            for (ds in dataSnapshot.getChildren()) {
                val recipeTemplate = ds.getValue(RecipeTemplate::class.java!!)
                list.add(recipeTemplate)
            }
            firebaseCallback.onCallback(list)
        }

        override fun onCancelled(databaseError: DatabaseError) {}
    })
}

最后,只需调用readData()函数,并在需要的地方将FirebaseCallback接口的实例作为参数传递,如下所示:

readFirebaseData(object : FirebaseCallback {
    override fun onCallback(list: MutableList<RecipeTemplate>) {
        //Do what you need to do with your list
    }
})

这是在onDataChange()函数之外使用该值的唯一方法。