when<TResult extends Object?> method

  1. @optionalTypeArgs
TResult when<TResult extends Object?>({
  1. required TResult inProgress(
    1. int receivedBytes
    ),
  2. required TResult completed(
    1. Uint8List data,
    2. int totalBytes,
    3. bool crcValid
    ),
  3. required TResult failed(
    1. String message,
    2. int? code,
    3. int? receivedBytes
    ),
  4. required TResult idle(),
})

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( int receivedBytes)  inProgress,required TResult Function( Uint8List data,  int totalBytes,  bool crcValid)  completed,required TResult Function( String message,  int? code,  int? receivedBytes)  failed,required TResult Function()  idle,}) {final _that = this;
switch (_that) {
case FetchProgressInProgress():
return inProgress(_that.receivedBytes);case FetchProgressCompleted():
return completed(_that.data,_that.totalBytes,_that.crcValid);case FetchProgressFailed():
return failed(_that.message,_that.code,_that.receivedBytes);case FetchProgressIdle():
return idle();case _:
  throw StateError('Unexpected subclass');

}
}