Firebase 完成回调如何在 Kotlin 中工作
Posted
技术标签:
【中文标题】Firebase 完成回调如何在 Kotlin 中工作【英文标题】:How does Firebase completion callbacks work in 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)
那么,我在这里缺少什么?为什么要用整个接口回调的东西?
【问题讨论】:
【参考方案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()
函数之外使用该值的唯一方法。
【讨论】:
以上是关于Firebase 完成回调如何在 Kotlin 中工作的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 firebase(android、kotlin)中记录错误?
完成回调未在 firebase 3.0.2 中的 set 方法上执行