如何将值从异步协程范围(例如 ViewModelScope)返回到您的 UI?

Ars*_*sal 6 android scope coroutine viewmodel kotlin

我正在尝试从数据库中检索单个条目并在 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
    }

}
Run Code Online (Sandbox Code Playgroud)

存储库

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

Nat*_* KR 11

LiveData可用于从ViewModelto获取值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.
}
Run Code Online (Sandbox Code Playgroud)

观察员 Fragment

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


Ars*_*sal 1

感谢 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

}

分段

 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())
    }
}
Run Code Online (Sandbox Code Playgroud)