Estoy declarando una variable global llamada basic_id dentro de la clase.

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

Estoy asignando valores de la base de datos al objeto personalizado (basicDetailsModel::class.java) y asigno su valor a la variable global basic_id ( Funciona bien )
Cuando comienza la actividad, muestra un brindis "On loading - 00"
Pero al hacer clic en el botón, muestra un brindis "Button clicked - 06"

Por qué no funciona en Toast "On loading - 06"

0
Irshaad 24 jun. 2020 a las 07:59

2 respuestas

Cuando se muestra "On loading -..." Toast basic_id la variable no tiene tiempo para cambiar, porque está haciendo una solicitud de red asincrónica, que puede ejecutarse en algún momento dependiendo de la conexión a Internet. Entonces Toast "On loading -..." se mostrará antes de que se cambie la variable basic_id.

0
Sergey 24 jun. 2020 a las 05:24

ValueEventListener no se ejecuta tan pronto como lo haya registrado, se activará una vez que se haya finalizado la solicitud de red, es posible que desee usar corutinas, pero una solución simple e ideal para su caso sería usar una devolución de llamada aquí.

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()}
        })
}
0
Animesh Sahu 24 jun. 2020 a las 06:15