java - 无法调用函数声明的 Kotlin 变量值
问题描述
我basic_id
在类内部声明了一个全局变量。
class userOverview : AppCompatActivity() {
private lateinit var database: FirebaseDatabase
private var basic_id : String = "00"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.user_overview)
database = FirebaseDatabase.getInstance()
loadBasicDetails() //this function will assign basic_id a non-zero value
//Display Toast of current value of basic_id
Toast.makeText(this, "On loading - "+basic_id, Toast.LENGTH_SHORT).show()
button.setOnClickListener() {
Toast.makeText(this, "Button clicked - "+basic_id, Toast.LENGTH_SHORT).show()
}
}
private fun loadBasicDetails() {
val q : Query = database.getReference("basic").orderByChild("epf_no").equalTo("12345")
q.addValueEventListener(object : ValueEventListener {
override fun onDataChange(data: DataSnapshot) {
for (dataChild in data.children) {
val basicDetails = dataChild.getValue(basicDetailsModel::class.java)
basic_id = basicDetails!!.basic_id
}
}
override fun onCancelled(error: DatabaseError) {error.toException()}
})
}
}
我正在将数据库值分配给自定义对象(basicDetailsModel::class.java
)并将其值分配给全局变量basic_id
(它工作正常)
当活动开始时,它显示一个 toast"On loading - 00"
但是当单击按钮时,它显示一个 toast"Button clicked - 06"
为什么它不能在 Toast 上工作"On loading - 06"
解决方案
ValueEventListener 不会在您注册后立即运行,它将在网络请求完成后触发,您可能想使用协程,但对于您的情况,一个简单而理想的解决方案是在这里使用回调。
override fun onCreate(savedInstanceState: Bundle?) {
//...
loadBasicDetails { // will be triggered after variable is set :)
Toast.makeText(this, "On loading - "+basic_id, Toast.LENGTH_SHORT).show()
}
//...
}
private inline fun loadBasicDetails(crossinline callback: () -> Unit) {
database.getReference("basic").orderByChild("epf_no").equalTo("12345")
.addValueEventListener(object : ValueEventListener {
override fun onDataChange(data: DataSnapshot) {
//... set the variable
callback()
}
override fun onCancelled(error: DatabaseError) {error.toException()}
})
}
推荐阅读
- ruby - S3 为不存在的项目创建签名 URL
- ecmascript-6 - lodash 按具有对象数组的属性对对象数组进行排序
- jquery - 触发航点时的多个动画
- testing - 使用 serialCorrelationTest() 对与 Ties 的自相关进行秩 von Neumann 检验
- r - 如何更改 rmdtemplate 材质主题中的颜色?
- powerbi - PowerBi 用条件减去不同行中的两个单元格
- python - 根据变量名称将列添加到数据框
- python - 当我已经安装父模块时,如何解决缺少的实用程序模块阻止我的可执行文件运行的问题?
- url - 如何使用复合卡下巴链接到外部 URL
- arrays - SAS 中的不良事件表