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