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)
感谢 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)
| 归档时间: |
|
| 查看次数: |
5470 次 |
| 最近记录: |