Tenho algumas perguntas sobre o Kotlin Flow
- Eu posso observar o LiveData de vários fragmentos. Posso fazer isso com o Flow? Se sim, então como?
- Podemos ter vários LiveData de um único LiveData usando
map
&switchMap
. Existe alguma maneira de ter vários fluxos a partir de um único fluxo de origem? - Usando
MutableLiveData
Eu posso atualizar dados de qualquer lugar usando a referência variável. Existe alguma maneira de fazer o mesmo com o Flow?
Eu tenho um caso de uso como: observarei um SharedPreferences
uso callbackFlow{...}
que me dará uma única fonte de fluxo. A partir desse fluxo, desejo criar vários fluxos para cada par de valores-chave.
Isso pode parecer perguntas tolas. Eu sou novo no mundo Rx e Flow.
Respostas:
Sim. Você pode fazer isso com
emit
ecollect
. Penseemit
é semelhante aos dados ativospostValue
ecollect
é semelhante aobserve
. Vamos dar um exemplo.Repositório
ViewModel
Fragmento
O fluxo é muito útil. Você pode apenas criar fluxo dentro do fluxo. Digamos que você queira anexar um sinal de grau a cada um dos dados da previsão do tempo.
ViewModel
Em seguida, colete os dados no fragmento igual ao nº 1. Aqui o que acontece é que o modelo de exibição está coletando dados do repositório e o fragmento está coletando dados do modelo de exibição.
Você não pode emitir valor fora do fluxo. O bloco de código dentro do fluxo é executado apenas quando existe um coletor. Mas você pode converter o fluxo em dados ativos usando a extensão asLiveData do LiveData.
ViewModel
No seu caso, você pode fazer isso
Editar
Obrigado a @mark pelo seu comentário. Criar um novo fluxo no modelo de visualização para a
getWeatherForecast
função é realmente desnecessário. Pode ser reescrito comofonte
val sharedPref = getSharedPref()
e você pode usar a coleta em vários lugaressharedPref.collect {}
. A única coisa é que, como a coleta é suspensa, é necessário chamá-lo do bloco de corotina. E feliz em ajudar np :)Há uma nova
Flow.asLiveData()
função de extensão nos novosandroidx.lifecycle
pacotes ktx. Você pode aprender mais no meu artigo: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020fonte
Em uma arquitetura de três camadas: apresentação do domínio de dados, o Flow deve ocorrer na camada de dados (bancos de dados, rede, cache ...) e depois como Samuel Urbanowicz mencionou, é possível mapear o Flow para o LiveData.
Em geral, o Flow é quase o que o Observable (ou Flowable) é para o RxJava. Não confunda com LiveData.
mais aqui: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
fonte