【问题标题】:Using .addOnSuccessListener to return a value for a private method使用 .addOnSuccessListener 返回私有方法的值
【发布时间】:2021-08-12 12:42:45
【问题描述】:

美好的一天。有什么方法可以实现这个吗?

val db = Firebase.firestore
        val userID = Firebase.auth.currentUser!!.uid
        val infoRef = db.collection("user").document(userID).collection("profile").document("info")
        infoRef.get()
            .addOnSuccessListener {document ->
                if(document != null){
                    //get the data as cast to hashmap
                    val data = document.data as HashMap<*, *>
                    //get the username field and set text for greet user as the same value inside firestore
                    val username = data["username"] as String
                    tv_greet_user.text = "Hello, $username"
                }
            }

//将上面的代码提取为一个名为“getUsername()”的新方法

val 用户名:String = getUsername()

tv_greet_user.text = "Hello, $username"

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    是的,您可以创建如下所示的函数:

    fun getUsername(data: HashMap<String, Any>) = data["username"] as String
    

    在你的回调中简单地调用:

    val username = getUsername(data)
    

    有没有办法将整个块提取到一个单独的方法中?因此,在 onCreate 方法中,我可以简单地将 TextView 更改为: val username = getUsername() tv_greet_user.text = "Hello, $username"

    编辑:

    正如 Frank van Puffelen 在他的 cannot return the result of an asynchronous operation 中提到的一种方法的结果。由于您使用的是 Kotlin 编程,请注意实际上是有解决方案的。我写了一篇文章叫:

    我在其中解释了从 Firestore 获取数据的四种方法。所以如果你愿意使用Kotlin Coroutines,那么事情会简单很多。

    【讨论】:

    • 有没有办法将整个块提取到单独的方法中?因此,在 onCreate 方法中,我可以简单地将 textview 更改为: val username = getUsername() tv_greet_user.text = "Hello, $username"
    • 并非如此。但请检查我更新的答案。
    • 感谢您提供这些参考资料!我一定会看看这个
    【解决方案2】:

    数据从 Firestore(以及大多数现代网络/云 API)异步加载。由于数据可用可能需要一些时间,因此您的主代码会在加载数据时继续运行。然后当数据可用时,您的成功侦听器回调会使用该数据调用。

    不幸的是,这意味着不可能在函数中从数据库中返回值,因为当return 语句运行时,数据还没有加载。

    这也正是为什么您的代码中的infoRef.get() 不只是从数据库中返回值,而是要求您传入一个回调函数,当数据库可用时它会调用该回调函数。当然,如果get() 会立即从数据库返回值,您的代码会简单得多,但它不能这样做,因为需要从网络加载数据。

    我推荐阅读:

    【讨论】:

    • 很乐意查看这些主题!谢谢!
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多