簡體   English   中英

ViewModel 中的 Kotlin Flow 有時不會從 Room 表中發出數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM