BlocBuilder не обновляется при изменении состояния

Я пытаюсь реализовать плеер с использованием шаблона BLOC. Когда я меняю состояние в методе mapEventToState (), виджет BlocBulder () не обновляется должным образом.

Это PlayerBloc: -

class PlayerBloc extends Bloc<PlayerEvent, PlayerState> {
  @override
  get initialState => PlayerState.Initialized;

  @override
  Stream<PlayerState> mapEventToState(PlayerEvent event) async* {
    if (event is InitialLoad) {
      yield PlayerState.Initialized;
    } else if (event is PlayStation) {
      yield PlayerState.Playing;
    } else if (event is StationPlaying) {
      yield PlayerState.Playing;
    } else if (event is StationStopped) {
      yield PlayerState.Stopped;
    } else {
      yield PlayerState.Stopped;
    }
  }
}

Это BlocBuilder: -

class PlayerCollapsed extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<PlayerBloc, PlayerState>(
      bloc: PlayerBloc(),
      builder: (BuildContext context, PlayerState state) {
        if (state == PlayerState.Initialized) {
          print(state);
          return Center(child: CircularProgressIndicator());
        } else {
          return Text("State Updated");
        }
      },
    );
  }
}

Любая помощь будет оценена по достоинству. ????


person Sudeep Bashistha    schedule 17.03.2020    source источник
comment
Как вы передаете событие? Вы используете другой экземпляр PlayerBloc?   -  person Federick Jonathan    schedule 17.03.2020
comment
Я так делаю: -_ 1_   -  person Sudeep Bashistha    schedule 17.03.2020


Ответы (1)


Хорошо, что произошло: вы использовали экземпляр PlayerBloc, предоставленный BlocProvider, для генерации события, но вы используете другой экземпляр PlayerBloc для своего BlocBuilder.

Если вы предоставили PlayerBloc поддереву с помощью BlocProvider, вы не хотите создавать новый.

class PlayerCollapsed extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<PlayerBloc, PlayerState>(
      // bloc: PlayerBloc(), <= delete this part
      builder: (BuildContext context, PlayerState state) {
        if (state == PlayerState.Initialized) {
          print(state);
          return Center(child: CircularProgressIndicator());
        } else {
          return Text("State Updated");
        }
      },
    );
  }
}

Вы можете проверить это https://github.com/felangel/bloc/issues/943#issuecomment-596220570

person Federick Jonathan    schedule 17.03.2020
comment
Спасибо..!! github.com/felangel/bloc/issues/943#issuecomment-596220570 Все прояснил. - person Sudeep Bashistha; 18.03.2020