【问题标题】:Expected a value of type 'A', but got one of type 'B' occurred in bloc Instance of 'Bloc'应为“A”类型的值,但在“Bloc”的 bloc 实例中出现“B”类型之一
【发布时间】:2020-12-06 19:05:17
【问题描述】:

我刚开始学习 bloc,我正在尝试制作购物车 bloc,但出现状态错误:

错误:未处理的错误应为“CartSuccess”类型的值,但在“CartBloc”的块实例中出现“CartLoading”类型之一。

即使我删除了yield CartLoading(),错误也会变成:

错误:未处理的错误应为“CartSuccess”类型的值,但在“CartBloc”的 bloc 实例中出现“CartInitial”类型的值。

购物车状态

abstract class CartState extends Equatable {
  const CartState();
  
  @override
  List<Object> get props => [];
}

class CartInitial extends CartState {}

class CartLoading extends CartState {}

class CartSuccess extends CartState {

  final List<ProductModel> carts;

  const CartSuccess(this.carts);

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

}

class CartFailed extends CartState {}

购物车活动

abstract class CartEvent extends Equatable {
  const CartEvent();

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

class FetchCart extends CartEvent {}

class AddToCart extends CartEvent {
  final ProductModel product;
  const AddToCart(this.product);
  @override
  List<Object> get props => [product];
}

class RemoveFromCart extends CartEvent {

  final ProductModel product;
  const RemoveFromCart(this.product);
  @override
  List<Object> get props => [product];
}

购物车组

class CartBloc extends Bloc<CartEvent, CartState> {
  CartBloc() : super(CartInitial());

  @override
  Stream<CartState> mapEventToState(CartEvent event) async* {
    
    yield CartLoading();

    if(event is FetchCart){
      final List<ProductModel> carts = List.from((state as CartSuccess).carts);
      yield CartSuccess(carts);
    }

    if(event is AddToCart){
      try{
        final List<ProductModel> carts = List.from((state as CartSuccess).carts)
          ..add(event.product);
        yield CartSuccess(carts);
      }catch(e){
        yield CartFailed();
        print(e);
      }
    }

    if(event is RemoveFromCart){
      try{
        final carts = (state as CartSuccess)
            .carts
            .where((product) => product.id != event.product.id)
            .toList();
        yield CartSuccess(carts);
      }catch(e){
        yield CartFailed();
        print(e);
      }
    }

  }
}

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    我猜这来自这里:List.from((state as CartSuccess).carts)。您在此之前 yield yield CartLoading();,因此您的状态不再是 CartSuccess 而是 CartLoading。您之前的 CartSuccess 状态因产生 CartLoading 而丢失

    【讨论】:

    • 即使我删除了 yield CartLoading();,我仍然收到另一个错误错误:未处理的错误预期类型为“CartSuccess”的值,但在 bloc 实例中出现了“CartInitial”类型之一'购物车'
    • 当然,因为您从来没有达到 CartSuccess 是直接前驱状态的地步。将状态数据存储在块内的变量中
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2021-08-10
    • 2019-10-28
    • 2019-09-02
    • 2021-07-18
    • 2022-12-05
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多