Digamos que tenho uma classe que emite um fluxo e uma função em outra classe que o coleta:
ISSO FUNCIONA
class DebugMessage { val sharedFlow = MutableSharedFlow<String>() fun makeFlow() { GlobalScope.launch(Dispatchers.Default) { for (i in 0 until 10) { sharedFlow.emit(Random.nextInt(1,100).toString()) delay(200) } } } fun getFlow(): Flow<String> { makeFlow() return sharedFlow } }
E
private fun collectDebugMsg() { GlobalScope.launch(Dispatchers.Default) { val getFlow = DebugMessage().getFlow() getFlow.collect { Timber.d("VALUE IS $it") } } }
Isso funciona como esperado, mas é um pouco inútil. Eu preciso dividir o makeFlow
e as getFlow
funções. Eu chamaria primeiro a makeFlow
função e depois a getFlow
função. Seria, por exemplo:
ISSO NÃO FUNCIONA
class DebugMessage { val sharedFlow = MutableSharedFlow<String>() fun makeFlow() { GlobalScope.launch(Dispatchers.Default) { for (i in 0 until 10) { sharedFlow.emit(Random.nextInt(1,100).toString()) delay(200) } } } fun getFlow(): Flow<String> { //makeFlow() // Call 'makeFlow' from outside the DebugMessage Class return sharedFlow } }
E
private fun collectDebugMsg() { GlobalScope.launch(Dispatchers.Default) { DebugMessage().makeFlow() // Call 'makeFlow' from outside the DebugMessage Class val getFlow = DebugMessage().getFlow() getFlow.collect { Timber.d("VALUE IS $it") } } }
O fluxo não está mais coletando nada. Alguém tem ideia do porquê disso?
Cada chamada para
DebugMessage()
cria uma instância nova e distinta daDebugMessage
classe.DebugMessage().makeFlow()
cria uma instância e a "ativa", depoisDebugMessage().getFlow()
cria outra instância e coleta seu fluxo enquanto ainda não está ativado. Para corrigir o problema você deve coletar da mesma instância que ativou: