![](/img/trans.png)
[英]Viewmodel doesn't update data from Android Room, but successfully insert in it
[英]Kotlin Flow in ViewModel doesn't emit data from Room table sometimes
我試圖在我的 ViewModel 中組合三個不同的流來制作一個項目列表,然后將這些項目顯示在一個片段中的 RecyclerView 上。 我發現當導航到屏幕時,當表中還沒有數據時, testData1 的流不會發出表中的數據。 可能發生 1/5 的時間。 我認為這是一個時間問題,因為它經常發生,但我不太明白為什么會發生。 此外,這只發生在我組合流時,所以也許我只能在一個 ViewModel 中擁有這么多流?
我添加了一些代碼來檢查 setListData() 期間數據是否在表中,並且它肯定在那里。 我也可以看到正在發生的發射,但是沒有來自房間的數據。 任何指導將不勝感激!
我正在使用的版本:
科特林:1.4.20-RC
房間:2.3.0-alpha03
這是我的 ViewModel
class DemoViewModel @Inject constructor(
demoService: DemoService,
private val demoRepository: DemoRepository
) : ViewModel() {
private val _testData1 = demoRepository.getData1AsFlow()
private val _testData2 = demoRepository.getData2AsFlow()
private val _testData3 = demoRepository.getData3AsFlow()
override val mainList = combine(_testData1, _testData2, _testData3) { testData1, testData2, testData3 ->
setListData(testData1, testData2, testData3)
}.flowOn(Dispatchers.Default)
.asLiveData()
init {
viewModelScope.launch(Dispatchers.IO) {
demoService.getData()
}
}
private suspend fun setListData(testData1: List<DemoData1>, testData2: List<DemoData2>, testData3: List<DemoData3>): List<CombinedData> {
// package the three data elements up to one list of rows
...
}
}
這是我的 Repository/DAO 層(對每種類型的數據重復)
@Query("SELECT * FROM demo_data_1_table")
abstract fun getData1AsFlow() : Flow<List<DemoData1>>
我能夠通過在組合函數中刪除 flowOn 來解決這個問題。 刪除那個電話后,我不再有這個問題。
我仍然想在默認調度程序上運行 setListData 函數,所以我只是更改了 setListData 中的上下文。
class DemoViewModel @Inject constructor(
demoService: DemoService,
private val demoRepository: DemoRepository
) : ViewModel() {
private val _testData1 = demoRepository.getData1AsFlow()
private val _testData2 = demoRepository.getData2AsFlow()
private val _testData3 = demoRepository.getData3AsFlow()
override val mainList = combine(_testData1, _testData2, _testData3) { testData1, testData2, testData3 ->
setListData(testData1, testData2, testData3)
}.asLiveData()
init {
viewModelScope.launch(Dispatchers.IO) {
demoService.getData()
}
}
private suspend fun setListData(testData1: List<DemoData1>, testData2: List<DemoData2>, testData3: List<DemoData3>): List<CombinedData> = withContext(Dispatchers.Default) {
// package the three data elements up to one list of rows
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.