es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para escuchar un stream y emitir nuevos estados dependiendo de los eventos del stream en un flutter_bloc, debes crear una instancia de StreamSubscription y utilizar su callback onData para llamar al método emit del bloc. El callback onData se invocará cada vez que el stream emita un nuevo evento.

    Aquí tienes un ejemplo de cómo hacer esto:

    class InvestmentClubBloc extends Bloc<investmentclubevent, investmentclubstate=""> {
      final InvestmentClubRepository investmentClubRepository;
      late StreamSubscription onChangeSubscription;
    
      InvestmentClubBloc({required this.investmentClubRepository})
          : super(InvestmentClubLoading()) {
        onChangeSubscription =
            investmentClubRepository.onNewMessage.listen((event) {
          add(NewMessageEvent(event));
        });
      }
    
      @override
      Stream<investmentclubstate> mapEventToState(InvestmentClubEvent event) async* {
        if (event is NewMessageEvent) {
          yield NewMessageState(event.message);
        }
      }
    
      @override
      Future<void> close() {
        onChangeSubscription.cancel();
        return super.close();
      }
    }
    

    En este ejemplo, cada vez que investmentClubRepository detecta un nuevo mensaje, llama al constructor NewMessageEvent con el nuevo mensaje como argumento. El método mapEventToState del bloc mapea este evento a un nuevo estado y lo emite utilizando la palabra clave yield.

    Ten en cuenta que también sobrescribimos el método close para cancelar el StreamSubscription cuando el bloc se cierra y evitar fugas de recursos.</investmentclubevent,>

Comments are closed.