簡體   English   中英

無法收集 kotlin 流量

[英]Cannot collect kotlin Flow

執行此行時我的代碼總是退出,實際上我已經使用協程來執行收集器代碼,並且也已經使用更新的協程庫

viewModel.rtList.collect{ list ->
    adapter.submitList(list)
} 

這是我的完整收集器代碼

 viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                Toast.makeText(requireContext(), "collect", Toast.LENGTH_SHORT).show()
                try {
                    viewModel.rtList.collect{ list ->
                        adapter.submitList(list)
                    }
                }catch (e:Exception){
                    Log.e(TAG, "initObserver: ${e.message}", )
                }
                
            }
        }

這是在 ViewModel

 private var _rtList= MutableSharedFlow<List<DataRt>>()
 val rtList: SharedFlow<List<DataRt>> = _rtList

 fun getRtList() {
        viewModelScope.launch {
            val list = mutableListOf<DataRt>()
            for (rt in 1..12){
                val dataRt = DataRt(rt.toString(),"0")
                list.add(dataRt)
            }
            _rtList.emit(list)
        }
    }
    ```

請確保在數據發出之前開始收集數據。 例如在啟動協程后調用viewModel.getRtList()來收集數據:

viewModel.rtList.collect { list ->
    adapter.submitList(list)
} 

viewModel.getRtList()

或者在這種情況下,最好使用flow{}構建器在每次收集Flow時執行代碼塊:

ViewModel

fun getRtList() = flow {
    val list = mutableListOf<DataRt>()
    for (rt in 1..12){
        val dataRt = DataRt(rt.toString(),"0")
        list.add(dataRt)
    }
    emit(list)
}

Activity/Fragment

viewModel.getRtList().collect{ list ->
    adapter.submitList(list)
} 

或者事件更好的解決方案:不要在這里使用Flow ,因為你只發出一個值並且你不調用suspend函數:

ViewModel

fun getRtList(): List<DataRt> {
    val list = mutableListOf<DataRt>()
    for (rt in 1..12){
        val dataRt = DataRt(rt.toString(),"0")
        list.add(dataRt)
    }
    return list
}

Activity/Fragment

adapter.submitList(viewModel.getRtList())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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