简体   繁体   English

如何使用 BLoC 和 equatable 更新 Map?

[英]How do I update a Map with BLoC and equatable?

I am still a beginner with BLoC architecture.我仍然是 BLoC 架构的初学者。 So far the UI updates when using int, bool, and other basic data types.到目前为止,使用 int、bool 和其他基本数据类型时 UI 会更新。 But when it comes to Maps it really confuses me.但是当涉及到地图时,它真的让我感到困惑。 My code basically looks like this:我的代码基本上是这样的:

my state我的 state

enum TalentStatus { initial, loading, loaded, error }

class TalentState extends Equatable {
  const TalentState({
    required this.talentStatus,
    this.selectedService = const {},
    required this.talents,
    this.test = 0,
  });

  final TalentStatus talentStatus;
  final Talents talents;
  final Map<String, Service> selectedService;
  final int test;

  TalentState copyWith({
    TalentStatus? talentStatus,
    Talents? talents,
    Map<String, Service>? selectedService,
    int? test,
  }) =>
      TalentState(
        selectedService: selectedService ?? this.selectedService,
        talentStatus: talentStatus ?? this.talentStatus,
        talents: talents ?? this.talents,
        test: test ?? this.test,
      );

  @override
  List<Object> get props => [talentStatus, talents, selectedService, test];
}

my event我的活动

abstract class TalentEvent extends Equatable {
  const TalentEvent();

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

class TalentStarted extends TalentEvent {}

class TalentSelectService extends TalentEvent {
  const TalentSelectService(
    this.service,
    this.talentName,
  );

  final Service service;
  final String talentName;
}

and my bloc和我的集团

class TalentBloc extends Bloc<TalentEvent, TalentState> {
  TalentBloc(this._talentRepository)
      : super(TalentState(
            talentStatus: TalentStatus.initial, talents: Talents())) {
    on<TalentSelectService>(_selectService);
  }

  final TalentRepository _talentRepository;

  Future<void> _selectService(
    TalentSelectService event,
    Emitter<TalentState> emit,
  ) async {
    state.selectedService[event.talentName] = event.service;
    final selectedService = Map<String, Service>.of(state.selectedService);

    emit(
      state.copyWith(
        selectedService: selectedService,
      ),
    );
  }
}

whenever an event TalentSelectService is called BlocBuilder doesn't trigger, what's wrong with my code?每当调用TalentSelectService的事件 BlocBuilder 不会触发时,我的代码有什么问题?

Your Service object must be comparable.您的Service object 必须具有可比性。 One suggestion is that it extends Equatable .一个建议是它扩展Equatable Either way it have to implement (override) the == operator and hashCode无论哪种方式,它都必须实现(覆盖) ==运算符和hashCode

The reason your BlocBuilder doesn't trigger is (probably) that it doesn't recognize that there has been a change in the Map.您的 BlocBuilder 没有触发的原因是(可能)它没有认识到 Map 发生了变化。

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

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