Как вернуть значение из asyn c сопрограммы, например ViewModelScope, в ваш пользовательский интерфейс? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь получить одну запись из базы данных и успешно возвращаю значение в моей модели представления с помощью viewModelScope, но я хочу, чтобы это значение было возвращено обратно в вызывающую функцию, которая находится в фрагмент, так что он может быть отображен в TextView. Я пытался вернуть значение обычным способом, но это не сработало. Итак, как я могу вернуть это значение из viewModelScope.launch в вызывающую функцию?

Просмотр модели

    fun findbyID(id: Int) {
    viewModelScope.launch {
       val returnedrepo = repo.delete(id)
        Log.e(TAG,returnedrepo.toString())
        // how to return value from here to Fragment
    }

}

Репозиторий

    suspend fun findbyID(id : Int):userentity{
    val returneddao = Dao.findbyID(id)
    Log.e(TAG,returneddao.toString())
    return returneddao
}

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Спасибо Nataraj KR за вашу помощь!

Ниже приведен код, который работал для меня.

Просмотреть модель

class ViewModel(application: Application):AndroidViewModel(application) {
val TAG = "ViewModel"
val repo: theRepository
val alldata:LiveData<List<userentity>>
val returnedVal = MutableLiveData<userentity>()
init {
    val getDao = UserRoomDatabase.getDatabase(application).userDao()
    repo = theRepository(getDao)
    alldata = repo.allUsers

}

fun findbyID(id: Int){
    viewModelScope.launch {
       returnedVal.value = repo.findbyID(id)
    }
}

}

Фрагмент

 override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    val usermodel = ViewModelProvider(this).get(ViewModel::class.java)
    usermodel.alldata.observe(this, Observer {
        Log.e(TAG,usermodel.alldata.value.toString())
    })
    usermodel.returnedVal.observe(this, Observer {
        tv1.text = usermodel.returnedVal.value.toString()
    })

    allData.setOnClickListener {
        tv1.text = usermodel.alldata.value.toString()
    }

    findByID.setOnClickListener {
        usermodel.findbyID(et2.text.toString().toInt())
    }
}
1 голос
/ 29 марта 2020

LiveData может использоваться для получения значения от ViewModel до Fragment.

Сделать функцию findbyID вернуть LiveData и наблюдать ее во фрагменте.

Функция в ViewModel

fun findbyID(id: Int): LiveData</*your data type*/> {
    val result = MutableLiveData</*your data type*/>()
    viewModelScope.launch {
       val returnedrepo = repo.delete(id)
       result.postValue(returnedrepo)
    }
    return result.
}

Наблюдатель в Fragment

findbyId.observer(viewLifeCycleOwner, Observer { returnedrepo ->
   /* logic to set the textview */
})
...