Как получить значение Flow вне сопрограммы? - PullRequest
2 голосов
/ 13 апреля 2020

Как я могу получить значение Flow вне сопрограммы, аналогично LiveData?

// Suspend function 'first' should be called only from a coroutine or another suspend function
flowOf(1).first()
// value is null
flowOf(1).asLiveData().value
// works
MutableLiveData(1).value

Context

I'm избегая LiveData в слое хранилища в пользу Flow. Тем не менее, мне нужно установить, наблюдать и собирать стоимость для немедленного потребления. Последнее полезно для аутентификации в OkHttp3 Interceptor.

1 Ответ

2 голосов
/ 14 апреля 2020

Ну ... то, что вы ищете, на самом деле не то, для чего Flow. Flow это просто поток. Он не является держателем значения, поэтому вам не нужно ничего извлекать.

Итак, есть два основных пути к снижению go, в зависимости от потребностей вашего перехватчика.

Возможно, ваш перехватчик может жить без данных из хранилища. IOW, вы будете использовать данные, если они существуют, но в противном случае перехватчик может продолжаться. В этом случае вы можете сделать так, чтобы ваш репозиторий испускал поток, но также поддерживал кэш "текущего значения", который может использовать ваш перехватчик. Это может быть через:

  • BroadcastChannel
  • LiveData
  • простое свойство в хранилище, которое вы обновляете внутри и представляете как val

Если данные вашего перехватчика нуждаются в данных, то ни один из них не будет работать напрямую, поскольку все они приведут к получению перехватчиком null, если данные еще не готовы. Вам понадобится вызов, который может блокировать, но, возможно, быстро оценивает, готовы ли данные через какую-либо форму кэша. Детали этого будут сильно различаться в зависимости от реализации репозитория и того, что в первую очередь поставляет Flow.

...