繁体   English   中英

Flutter bloc 在更改状态时重建

[英]Flutter bloc rebuild on change state

为了过滤我的列表,我使用状态 FilterState。 我的列表过滤器处于这种状态,但构建列表的小部件未重建。 我的打印显示该列表根据状态是正确的。 但是GameList保持其未过滤的初始状态:它没有重建。

谢谢,

我的状态页面:

            BlocBuilder<GameBloc, GameState>(
                builder: (context, state) {
                  if (state is LoadingState) {
                    return buildLoading();
                  } else if (state is FailState) {
                    return ErrorUI(message: state.message);
                  } else if (state is ListLoadedState) {
                    _list = state.list;
                    return GameList(list: state.list!);
                  } else if (state is FilterGamesState) {
                    print(state.list);
                    return GameList(list: state.list!);
                  }
                  return Container();
                },
              ),

集团页面:

class GameBloc extends Bloc<GameEvent, GameState> {
  GameBloc({required this.repository}) : super(LoadingState()) {
    on<BackEvent>(_onBackEvent);
    on<FetchGamesEvent>(_onFetchList);
    on<FetchGameEvent>(_onFetchItem);
    on<SavingEvent>(_onSavingEvent);
    on<UpdateGameEvent>(_onUpdate);
    on<CreateGameEvent>(_onCreate);
    on<FilterGamesEvent>(_onFilter);
  }

  GameRepository repository;
  final currentFilter = BehaviorSubject<Map<String, dynamic>>();

  Future<void> _onFilter(
    FilterGamesEvent event,
    Emitter<GameState> emit,
  ) async {
    try {
      emit(LoadingState());
      final list = event.list?.where((Game item) {
        if (currentFilter.value.containsKey('player')) {
          int players = currentFilter.value['player'].nb;
          return players.isBetween(from: item.nopMin, to: item.nopMax);
        }
        return true;
      }).where((Game item) {
        if (currentFilter.value.containsKey('age')) {
          return item.age!.isBetween(
              from: currentFilter.value['age'].min,
              to: currentFilter.value['age'].max);
        }
        return true;
      }).where((Game item) {
        if (currentFilter.value.containsKey('duration')) {
          return compareToDuration(
              item.durMin!,
              item.durMax!,
              currentFilter.value['duration'].min,
              currentFilter.value['duration'].max);
        }
        return true;
      }).where((Game item) {
        if (currentFilter.value.containsKey('tags')) {
          return item.tags!
              .compareToList(currentFilter.value['tags'] as List<String>);
        }
        return true;
      }).where((Game item) {
        if (currentFilter.value.containsKey('collection')) {
          return item.collection!
              .compareToList(currentFilter.value['collection'] as List<String>);
        }
        return true;
      }).toList();
      emit(FilterGamesState(listGame: list!));
    } catch (e) {
      emit(const FailState(message: 'Failed to fetch all games data.'));
    }
  }

活动页面:

abstract class GameEvent extends Equatable {
  final Game? item;
  const GameEvent({this.item});

  @override
  List<Object> get props => [];
}

class InitialEvent extends GameEvent {
  const InitialEvent({required Game item}) : super(item: item);
}

class BackEvent extends GameEvent {}

class SavingEvent extends GameEvent {}

class FetchGameEvent extends GameEvent {
  const FetchGameEvent({required Game item}) : super(item: item);
}

class FetchGamesEvent extends GameEvent {}

class FilterGamesEvent extends GameEvent {
  const FilterGamesEvent({required this.list});
  final List<Game>? list;
}

状态页面:

abstract class GameState extends Equatable {
  final Game? item;
  final List<Game>? list;
  const GameState({this.item, this.list});

  @override
  List<Object> get props => [];
}

class GameInitial extends GameState {}

class FailState extends GameState {
  const FailState({required this.message});
  final String message;
}

class LoadingState extends GameState {}

class ListLoadedState extends GameState {
  const ListLoadedState({required this.listGame}) : super(list: listGame);
  final List<Game> listGame;
}

class ItemLoadedState extends GameState {
  const ItemLoadedState({required this.game}) : super(item: game);
  final Game game;
}

class FilterGamesState extends GameState {
  const FilterGamesState({required this.listGame}) : super(list: listGame);
  final List<Game> listGame;
}

您正在使用 Equatable 但您的道具是空的。 如果您使用 Equatable,请确保将所有属性传递给 props getter。 (在您的州和事件中!)

来源: https ://bloclibrary.dev/#/faqs?id=state-not-updating

Flutter Todos 教程也可能会有所帮助,因为它也使用了过滤器。

我解决了这个,

我将密钥发送到 FilterGameState 中的 GameList。

else if (state is FilterGamesState) {
    print(state.list);
    return GameList(key: GlobalKey<GameFilterState>(), list: state.list!);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM