BlocBuilder不会根据状态更改进行更新

时间:2020-03-17 16:31:17

标签: flutter bloc flutter-bloc

我正在尝试使用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");
        }
      },
    );
  }
}

任何帮助将不胜感激。 ?

1 个答案:

答案 0 :(得分:1)

好吧,发生了什么事,您使用了BlocProvider提供的PlayerBloc实例来发出事件,但是您对BlocBuilder使用了不同的PlayerBloc实例。

如果您已使用BlocProvider将PlayerBloc提供给子树,则您不想创建一个新的树。

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