Sobes.tech
Middle+

O que é SharedFlow e como ele difere do StateFlow?

sobes.tech IA

Resposta da IA

SharedFlow e StateFlow são ambos tipos de flux da biblioteca kotlinx.coroutines, destinados à programação reativa e gestão de fluxos de dados assíncronos, mas têm objetivos e comportamentos diferentes.

StateFlow é um fluxo que sempre contém o estado atual (valor). Semelhante a um Observable com o último valor, que pode ser obtido a qualquer momento. O StateFlow mantém sempre um valor atual e ao subscrever-se emite imediatamente esse valor. É útil para representar o estado da interface de utilizador ou outros dados que devem ter um valor atual.

SharedFlow é um fluxo mais geral que pode ter múltiplos subscritores e não mantém estado por padrão. Pode ser configurado com um buffer e políticas de reenvio de eventos (replay). O SharedFlow é usado para transmissão de eventos de forma difusa, que não precisam necessariamente de um valor atual, como eventos de navegação, notificações ou sinais de uso único.

Diferenças principais:

  • O StateFlow sempre contém o estado atual, o SharedFlow não (se replay=0).
  • O StateFlow ao subscrever-se emite imediatamente o valor atual, o SharedFlow apenas se estiver configurado com replay.
  • O SharedFlow é mais flexível e adequado para eventos, o StateFlow para estado.

Exemplo de uso do StateFlow:

val stateFlow = MutableStateFlow(0)

// Atualizar estado
stateFlow.value = 1

// Subscrever
stateFlow.collect { value ->
    println("Valor atual: $value")
}

Exemplo de SharedFlow com replay:

val sharedFlow = MutableSharedFlow<Int>(replay = 1)

// Emitir evento
sharedFlow.emit(42)

// Novo subscritor receberá o último evento graças ao replay
sharedFlow.collect { evento ->
    println("Evento recebido: $evento")
}