首页 > 解决方案 > 无法调用函数声明的 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"

标签: javaandroidfirebasekotlin

解决方案


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()}
        })
}

推荐阅读