未在 Successlistener Android 中分配值

Value is not assigned In Successlistener Android

提问人:Jadu 提问时间:12/26/2022 更新时间:12/26/2022 访问量:85

问:

我正在尝试设置我已全局声明的变量的值,但是当我将其设置为默认值时......
让我向你展示代码......

var userWeight:Double = 0.0

在这里,我正在尝试更新 userWeight 值,但它在 sucesslistener 外部设置为 0.0,并且在其中,该值已正确更新......

这是我的日志,可以更好地澄清这一点

 getUserDetails().addOnSuccessListener { document->
            userWeight = document.toObject(User::class.java)!!.weight.toDouble()
            Log.d("temperory","$userWeight")
        }

enter image description here

getUserDetails().addOnSuccessListener { document->
            userWeight = document.toObject(User::class.java)!!.weight.toDouble()
            Log.d("temperory","$userWeight")
        }

        Log.d("weightuser","$userWeight")

enter image description here

Android 变量

评论

0赞 Priyanshu 12/26/2022
你能详细说明你的问题吗?就像问为什么第二个带有标签的日志作为 weightuser 打印权重为 0?
0赞 Jadu 12/26/2022
不!实际上,我已经声明了一个名为userWeight的全局变量,但是当我尝试在successlistener中更新userWeight的值时,请参阅代码,该值为0.0,它应该由我从快照中获得的值进行更新
0赞 Priyanshu 12/26/2022
Firebase 调用以异步方式工作。因此,您需要等到侦听器中的值更新。目前,在更新侦听器中的用户权重值之前,第二个日志正在运行
0赞 Jadu 12/26/2022
你能提出一些改变吗?
0赞 Priyanshu 12/26/2022
您可以查看我建议的三种方式

答:

1赞 Priyanshu 12/26/2022 #1

Firebase Calls 以异步方式工作,因此我们有不同的处理方式。

1) 回调 - 您可以创建接口并使用回调来更新值。

这是参考 - 链接

2) 协程 await() 函数 - 您需要添加 kotlinx-coroutines-play-services 库才能使用 await() 函数。 这是参考 -

import kotlinx.coroutines.tasks.await 
suspend fun getIdTokenForUser (
    user: FirebaseUser
): GetTokenResult {
    return try {
        user.getIdToken().await()
    } 
    catch (e: Exception) {
        // handle error
    }
}

3) 仅在侦听器内执行与用户权重相关的操作

评论

0赞 Jadu 12/26/2022
谢谢,我用了第三个!它奏效了欢呼声