Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase完成回调在Kotlin中如何工作_Android_Firebase_Firebase Realtime Database_Kotlin - Fatal编程技术网

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

Android Firebase完成回调在Kotlin中如何工作,android,firebase,firebase-realtime-database,kotlin,Android,Firebase,Firebase Realtime Database,Kotlin,我已成功地从Firebase读取数据,并使用完成回调在imageView中异步显示数据。作为编程新手,我仍然很难理解回调的一些机制,希望有人能对我的一些问题有所帮助。我已经阅读并观看了多个教程和解释,但仍难以理解一些概念。这是我的Firebase代码: 第1部分: readFirebaseData(object: FirebaseCallback{ override fun onCallback(list: MutableList<RecipeTemplate>) {

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

第1部分:

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

            glideVariable?.loadImageUrl(recipeArray[1].recipeImage) //WORKS!!
        }
})
第3部分:

interface FirebaseCallback {
    fun onCallback(list: MutableList<RecipeTemplate>)
}
然后,测试功能本身:

 fun test(list: MutableList<RecipeTemplate>) {
    Log.d("TAGM", "DONE WITH FB")
    glideVariable?.loadImageUrl(recipeArray[3].recipeImage)    
}
fun测试(列表:可变列表){
日志d(“TAGM”,“完成FB”)
glideVariable?.loadImageUrl(recipeArray[3].recipeImage)
}

那么,我错过了什么?为什么要使用整个接口回调呢?

要解决这个问题,您需要创建自己的回调,等待Firebase返回数据。要实现这一点,首先需要创建一个
接口
,如下所示:

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) {}
    })
}
readFirebaseData(object : FirebaseCallback {
    override fun onCallback(list: MutableList<RecipeTemplate>) {
        //Do what you need to do with your list
    }
})
这是在
onDataChange()
函数之外使用该值的唯一方法

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