web-dev-qa-db-ja.com

ViewModelScopeなどの非同期コルーチンスコープからUIに値を返す方法は?

データベースから単一のエントリを取得しようとしていますが、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
Arsal

ナタラジ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
Arsal