Как я могу получить доступ к объекту, связанному с LiveData, вне наблюдателя?

1

Я делаю приложение, которое использует пространство и Livedata для хранения и отображения данных, я могу создавать и удалять отдельные элементы без проблем, но я изо всех сил пытаюсь создать процесс для обновления значений.

Проблема в том, что мне нужно получить доступ к объекту, связанному с объектом LiveData, за пределами наблюдателя, чтобы изменить значения объекта и обновить его с помощью модели представления, но когда я пытаюсь использовать LiveData.value, я всегда получаю нулевое значение за пределами наблюдателя и действительный объект внутри наблюдателя (я показываю это, используя тост и перекус, как вы можете видеть в коде ниже).

Итак, как я могу получить доступ или обновить объект, связанный с LiveData вне наблюдателя?

    if(intent.hasExtra("MEDICINE_ID")){
        title = getString(R.string.editar_medicamento)
        medicamentoActualLive = medicamentoViewModel.getMedicamento(intent.getIntExtra("MEDICINE_ID",-1))
        medicamentoActualLive.observe(this, android.arch.lifecycle.Observer {
            CampoNombreComercial.setText(it!!.nombreMedicamento,TextView.BufferType.EDITABLE)
            CampoNombreGenerico.setText(it!!.nombreGenerico,TextView.BufferType.EDITABLE)
            CampoDosis.setText(it!!.dosis,TextView.BufferType.EDITABLE)
            CampoNota.setText(it!!.nota,TextView.BufferType.EDITABLE)

            val MedicineTypeIndex =  this.resources.getStringArray(R.array.TipoMedicamento).indexOf(it!!.tipo)
            SpinnerTipoMedicamento.setSelection(MedicineTypeIndex)

            MedicamentoIconoTV.setColorFilter(it.color!!)

            mCurrentPhotoPath = it.fotografia!!
            displayPic()

            medicamento = it
            Toast.makeText(this@AnadirMedicamentoActivity,"El valor del medicamento live es: " + medicamento.nombreGenerico, Toast.LENGTH_SHORT).show()
        })

        Snackbar.make(LayoutConstrain,"El valor del medicamento live externo: " + medicamentoActualLive.value?.nombreGenerico, Snackbar.LENGTH_SHORT).show()

    }else{
        title = getString(R.string.AnadirMedicamento)
    }

Процесс сохранения или обновления выполняется в этой функции, вызываемой в методе onClick кнопки с плавающим действием:

private fun saveMedicineToDB(medicamento: Medicamento){
    if(intent.hasExtra("USER_ID")){
        medicamentoViewModel.update(medicamento)

    }else{
        medicamentoViewModel.insert(medicamento)
    }
    setResult(Activity.RESULT_OK)
    finish()
}
Теги:
kotlin
android-livedata

1 ответ

0
Лучший ответ

Я нашел решение этой проблемы, так как в комментариях говорится, что я не могу получить доступ к данным объекта LiveData из-за асинхронного запроса, но я могу получить доступ из события пользовательского интерфейса (в данном случае это событие onClick). Это мое решение:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val establecimiento : Establecimiento

    if(intent.hasExtra("ESTABLISHMENT_ID")){
        establecimiento = establecimientoActualLive.value!!
    }else{
        establecimiento = Establecimiento(0)
        val sharedPref = PreferenceManager.getDefaultSharedPreferences(this@AnadirEstablecimientoActivity)

        val usuarioID = sharedPref.getInt("actualUserID",-1)
        establecimiento.usuarioID = usuarioID

    }
    when (item.itemId) {
        R.id.itemSave -> {
            establecimiento.nombre  = NombreEstablecimientoTV.text.toString()
            establecimiento.tipo = tipoEstablecimiento
            establecimiento.direccion = DireccionEstablecimientoTV.text.toString()
            establecimiento.telefono1 = Telefono1EstablecimientoTV.text.toString()
            establecimiento.telefono2 = Telefono2EstablecimientoTV.text.toString()
            establecimiento.email = EmailEstablecimientoTV.text.toString()
            establecimiento.sitioWeb = SitioWebEstablecimeintoTV.text.toString()
            establecimiento.latitud = latitud
            establecimiento.longitud = longitud


            if(establecimiento.usuarioID != -1){

                saveEstablishmentToDB(establecimiento)
            }

            return true
        }
        android.R.id.home -> {
            onBackPressed()
            return true
        }
    }
    return super.onOptionsItemSelected(item)

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню