使用具有列表类型参数的 dart 类,如何使其具有等价性

Posted

技术标签:

【中文标题】使用具有列表类型参数的 dart 类,如何使其具有等价性【英文标题】:With a dart class that has a parameter of type list, how is it possible to make it equatable 【发布时间】:2020-04-15 13:48:11 【问题描述】:

我正在使用新的库 bloc_test 进行颤振,并实现了以下测试

blocTest('should return ReservationsLoadSucess when the use case returns a list of reservationsList',

    build: () 
      when(mockGetReservations(any)).thenAnswer((_) async => Right(reservationsList));
      return ReservationBloc(getReservations: mockGetReservations);
    ,
    act: (bloc) async 
      bloc.add(ReservationsRequested(user));
    ,
    expect: [
      ReservationsInitial(),
      ReservationsLoadInProgress(),
      ReservationsLoadSuccess(reservationsList),
    ],
  );

这是ReservationsLoadSuccess的实现

class ReservationsLoadSuccess extends ReservationState 
  final List<Reservation> list;

  ReservationsLoadSuccess(this.list);

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

ReservationState 扩展 Equatable 的地方 现在,在运行测试时,您会收到以下错误

should return ReservationsLoadSucess when the use case returns a list of reservationsList:

ERROR: Expected: [
            ReservationsInitial:ReservationsInitial,
            ReservationsLoadInProgress:ReservationsLoadInProgress,
            ReservationsLoadSuccess:ReservationsLoadSuccess
          ]
  Actual: [
            ReservationsInitial:ReservationsInitial,
            ReservationsLoadInProgress:ReservationsLoadInProgress,
            ReservationsLoadSuccess:ReservationsLoadSuccess
          ]
   Which: was ReservationsLoadSuccess:<ReservationsLoadSuccess> instead of ReservationsLoadSuccess:<ReservationsLoadSuccess> at location [2]

基本上说实际列表中位置 2 的状态 ReservationsLoadSuccess 不等于预期列表中的对等点。

我尝试在 ReservationsLoadSuccess 类中覆盖 == 运算符,如下所示

class ReservationsLoadSuccess extends ReservationState 
  final List<Reservation> list;

  ReservationsLoadSuccess(this.list);

  final Function eq = const ListEquality().equals;
  @override
  List<Object> get props => [];

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ReservationsLoadSuccess &&
          runtimeType == other.runtimeType &&
          eq(list, other.list);

但这似乎不起作用,运行测试仍然输出相同的错误。我让它工作的唯一方法是让 props 方法返回一个空列表或添加任何其他虚拟变量并将其传递给 props 列表。

有什么方法可以使类在列表参数方面相等?

【问题讨论】:

【参考方案1】:

您是否尝试查看包裹equatable。在应用 BLoC 模式时经常使用它。

【讨论】:

我确实提到了 ReservationState 抽象类确实扩展了 equatable。但是 Equatable 的实现并没有涵盖将迭代作为变量的场景。 equatable 所做的基本上是循环您类的所有参数,并将它们与另一个实例中的对等点进行比较。现在,当您将一个列表与另一个具有相同元素的列表进行比较时,它不会返回 true,除非它实际上是相同的列表(引用相等)

以上是关于使用具有列表类型参数的 dart 类,如何使其具有等价性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 dart Parse Json 中使用类作为数据类型

如何访问 Dart 中的对象列表中的对象列表

具有匿名类型的 C# LINQ 构建表达式

如何将具有时间戳字段的firestore doc数据转换为通过Freezed dart包生成的数据类?

dart - 如何从Dart中的列表中找到最小值和最大值

在 Dart 中枚举或映射具有索引和值的列表