when<TResult extends Object?> method

  1. @optionalTypeArgs
TResult when<TResult extends Object?>({
  1. required TResult initial(),
  2. required TResult loading(
    1. double progress
    ),
  3. required TResult success(
    1. T1 data1,
    2. T2 data2,
    3. T3 data3,
    4. T4 data4,
    5. T5 data5,
    ),
  4. required TResult failure(
    1. String error,
    2. bool show
    ),
})

A switch-like method, using callbacks.

As opposed to map, this offers destructuring. It is equivalent to doing:

switch (sealedClass) {
  case Subclass(:final field):
    return ...;
  case Subclass2(:final field2):
    return ...;
}

Implementation

@optionalTypeArgs
TResult when<TResult extends Object?>({
  required TResult Function() initial,
  required TResult Function(double progress) loading,
  required TResult Function(T1 data1, T2 data2, T3 data3, T4 data4, T5 data5)
      success,
  required TResult Function(String error, bool show) failure,
}) {
  final _that = this;
  switch (_that) {
    case _Sub5Initial():
      return initial();
    case _Sub5Loading():
      return loading(_that.progress);
    case _Sub5Success():
      return success(
          _that.data1, _that.data2, _that.data3, _that.data4, _that.data5);
    case _Sub5Failure():
      return failure(_that.error, _that.show);
    case _:
      throw StateError('Unexpected subclass');
  }
}