Search code examples
flutterblocflutter-bloc

How can Bloc listen to stream and emit state


In my flutter app, I use flutter_bloc for state management.

The bloc in question uses a repository. The repository subscribes to a websocket, and new data is added to a stream.

Problem: My bloc listens to the stream:

InvestmentClubBloc({
    required this.investmentClubRepository
  }) : super(InvestmentClubLoading()) {
    onChangeSubscription = investmentClubRepository.onNewMessage.listen(
      (event) {
        emit(NewMessageState(event); // <-- The member "emit" can only be used within 'package:bloc/src/bloc.dart' or in test
      },
    );
  }

The problem is that emit does not work (I get the warning "The member "emit" can only be used within 'package:bloc/src/bloc.dart' or in test")

How can bloc listen to a stream and emit new states depending on stream events?


Solution

  • You should use emit in eventHandler, use below code to complete your task:

    abstract class Event {}
    
    class DemoEvent extends Event {}
    
    var fakeStream =
        Stream<int>.periodic(const Duration(seconds: 1), (x) => x).take(15);
    
    class DemoBloc extends Bloc<Event, int> {
      DemoBloc() : super(0) {
        fakeStream.listen((_) {
          // add your event here
          add(DemoEvent());
        });
        on<DemoEvent>((_, emit) {
          // emit new state
          emit(state + 1);
        });
      }
    }