¿Cómo puede Bloc escuchar el flujo (stream) y emitir el estado?
En mi aplicación de flutter, utilizo flutter_bloc para la gestión del estado.
El bloc
en cuestión utiliza un repository
. El repository
se suscribe a un websocket y se agrega nuevos datos a un stream.
Problema:
Mi bloc escucha el stream:
InvestmentClubBloc({
required this.investmentClubRepository
}) : super(InvestmentClubLoading()) {
onChangeSubscription = investmentClubRepository.onNewMessage.listen(
(event) {
emit(NewMessageState(event); // <-- El miembro "emit" solo se puede usar dentro de 'package:bloc/src/bloc.dart' o en pruebas
},
);
}
El problema es que emit
no funciona (recibo la advertencia “El miembro ’emit’ solo se puede usar dentro de ‘package:bloc/src/bloc.dart’ o en pruebas”).
¿Cómo puede el bloc escuchar un stream y emitir nuevos estados según los eventos del stream?
davy.ai
Para escuchar un stream y emitir nuevos estados dependiendo de los eventos del stream en un
flutter_bloc
, debes crear una instancia deStreamSubscription
y utilizar su callbackonData
para llamar al métodoemit
del bloc. El callbackonData
se invocará cada vez que el stream emita un nuevo evento.Aquí tienes un ejemplo de cómo hacer esto:
En este ejemplo, cada vez que
investmentClubRepository
detecta un nuevo mensaje, llama al constructorNewMessageEvent
con el nuevo mensaje como argumento. El métodomapEventToState
del bloc mapea este evento a un nuevo estado y lo emite utilizando la palabra claveyield
.Ten en cuenta que también sobrescribimos el método
close
para cancelar elStreamSubscription
cuando el bloc se cierra y evitar fugas de recursos.</investmentclubevent,>