使用协程在Roomdb中成功插入数据时,我想获取回调

MyDao.kt

@Dao
interface MyDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(obj: Task): Long
}

TaskViewModel.kt
class TaskViewModel(var context:Context) : ViewModel{
    private var appDao: AppDao

    init {
        val db = AppDatabase.getInstance(context)
        appDao = db.appDao()
    }

    fun insertTask(tast: Task) {
        GlobalScope.launch {
          val mID = appDao.insert(task)
        }
    }
}

如何从mID方法返回insertTask()

提前谢谢你

最佳答案

withContext包裹调用,并将函数标记为暂停

suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }

从您的 Angular 来看:

fun saveTask(t: Task) = lifecycleScope.launch {
    val id = viewModel.insertTask(t)
    Toast.makeText(context, "Task $id has been inserted, Toast.LENGTH_SHORT).show()
}

您还可以返回一个LiveData,它在完成后触发回调:

fun insertTask(task: Task): LiveData<Long> {
    val liveData = MutableLiveData<Long>()
    viewModelScope.launch {
        liveData.value = dao.insertTask(task)
    }
    return liveData
}

进一步的建议

不要在 View 模型中保留对上下文的引用。如果需要上下文,请使用AndroidViewModelAndroidViewModel#getApplication()

10-07 16:34