Поток сопрограмм с Дао и дженери c Результат класса - PullRequest
1 голос
/ 28 февраля 2020

У меня есть класс Dao, который возвращает список объектов Car в виде потока.

@Query("SELECT * FROM Car")
fun getAllCars(): Flow<List<Car>>

В моем хранилище я могу использовать этот Dao следующим образом

fun getAllCars(): Flow<List<Car>>
//Implementation
override fun getAllCars() = carDao.getAllCars()

I можно наблюдать это flow в представленной модели и все работает и жизнь была в порядке.

Теперь, прочитав пост на Разработчик Android Сайт о

Общий c класс, который содержит данные и статус о загрузке этих данных.

Я вдохновился, поэтому прочитал еще один пост здесь , в котором обсуждается наличие класса Result.

Итак, я внес некоторые изменения в хранилище и не могу их решить.

Ошибка:


suspend fun getSomeData(): Flow<Result<List<Car>>> {
        carDao.getAllCars().collect {
            if (it.isNotEmpty()) {
                return flowOf(Result.Success(it))  //<-- Here I am getting error from IDE
            }
            else {
                val throwable = Throwable()
                return flowOf(Result.Failure<List<Car>>(throwable)) //<-- Here I am getting error from IDE
            }
        }
    }

Ошибка Return is not allowed here и Change to 'return@Collect'

Чего я хочу добиться:

// At view model side
viewmodelScope.launch {

    repo.getSomeData().collect {
      if (it == Result.Success) {
        //Show data
      }
      else {
        //Show empty screen
      }

    }
}

Не верен ли мой подход к реализации Результата? Я не могу понять, что не так. Почему я не могу просто вернуть Поток из потока

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Если вы хотите использовать Result, вы должны вернуть Result . Это будет выглядеть так:

        suspend fun getSomeData(): Result<Flow<List<Car>>> {
            return  carDao.getAllCars().collect {
                if (it.isNotEmpty()) {
                   Result.Success(flowOf(it)) 
                } else {
                   Result.Failure(Throwable())) 
                }
             }
        }
0 голосов
/ 29 февраля 2020

Вот как должна выглядеть ваша функция. Обратите внимание, что нет необходимости, чтобы он был suspend fun.

fun getSomeData(): Flow<Result<List<Car>>> = flow {
    carDao.getAllCars().collect {
        if (it.isNotEmpty()) {
            emit(Result.Success(it))
        }
        else {
            emit(Result.Failure<List<Car>>(Throwable()))
        }
    }
}

Но то, что он делает, это не что иное, как добавление шага отображения, который вы можете обобщить.

fun <T> Flow<List<T>>.toResultFlow(): Flow<Result<List<T>>> = this.map {
    if (it.isNotEmpty()) Result.Success(it)
    else Result.Failure(Throwable())
}

...