объедините два потока списков и обработайте уловы отдельно в Котлине

#android #kotlin #try-catch #flow

Вопрос:

Я хотел бы получить поток списка с сервера и поток списка с одним и тем же типом из базы данных и создать новый список после сравнения их вместе. давайте предположим, что у нас есть функция в репозитории, подобная этой:

  fun getAllItems():Flow<List<Item>>{    
           return flow<List<Item>> {
           val onlineItems = api.getAll()
           val offlineItems = db.getAll()
        
          val resultList= compareItems(onlineItems , offlineItems )
         
          emit(resultList)
        
        }.flowOn(Dispatchers.IO)
       }
 

и в ViewModel у нас есть что-то вроде этого:

 repo.getAllItems().onEach{
     _liveData.postValue(it)
}.catch{
      handleError(it)
}.launchOn(viewModelScope)
 

но иногда запрос API может столкнуться с исключением, и поэтому мы получим выбрасываемый объект в области захвата потока, а также это важно для обработки ошибок в ViewModel

каков наилучший подход для получения только автономного списка, если онлайн-список сталкивается с исключением, а также в то же время принимает исключение потока запроса API в ViewModel?

Пожалуйста, обратите внимание, что мне нужно, во-первых, получить список, только один раз выдав список(чтобы предотвратить мигание), а во-вторых, сравнить логику в репозитории, а не в ViewModel, и, в-третьих, в то же время мне тоже нужно получить представление о потоке в ViewModel.

даже я нахожу обходное решение :

    return flow<List<Item>> {
            val resultList= mutableListOf<Item>()
            var error:Exception?=null
            try {
                val onlineItems = api.getAll()                       
                resultList.addAll(onlineItems )
            }catch (e:java.lang.Exception){
                error = e
            }finally {
               val offlineItems = db.getAll()    
               resultList.addAll(compareItems(onlineItems , offlineItems ))

               emit(resultList)

               delay(100)

               error?.let {
                    throw it
                }
            }

        }.flowOn(Dispatchers.IO)
 

но таким образом я должен использовать задержку, чтобы поток работал хорошо (выдает ошибку после отправки списка), в противном случае он не работает и просто создает исключение.
и я действительно не хочу, чтобы мой код зависел от задержки, чтобы он работал нормально!
поэтому мне было интересно, не могли бы вы поделиться своими идеями, если у вас есть какие-либо лучшие решения.