【问题标题】:How does Firebase completion callbacks work in KotlinFirebase 完成回调如何在 Kotlin 中工作
【发布时间】:2018-12-05 04:18:29
【问题描述】:

我已成功从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

第三部分:

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

主要是我不明白界面的重点,以及整个覆盖功能部分(第 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)    
}

那么,我在这里缺少什么?为什么要用整个接口回调的东西?

【问题讨论】:

    标签: android firebase firebase-realtime-database kotlin


    【解决方案1】:

    要解决这个问题,您需要创建自己的回调来等待 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() 函数之外使用该值的唯一方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多