when<TResult extends Object?> method

  1. @optionalTypeArgs
TResult when<TResult extends Object?>({
  1. required TResult inProgress(
    1. int elapsedSeconds,
    2. int totalSeconds,
    3. double? fraction
    ),
  2. required TResult completed(
    1. int totalSeconds
    ),
  3. required TResult failed(
    1. String message,
    2. int? code,
    3. int? elapsedSeconds
    ),
  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 elapsedSeconds,  int totalSeconds,  double? fraction)  inProgress,required TResult Function( int totalSeconds)  completed,required TResult Function( String message,  int? code,  int? elapsedSeconds)  failed,required TResult Function()  idle,}) {final _that = this;
switch (_that) {
case MeasurementProgressInProgress():
return inProgress(_that.elapsedSeconds,_that.totalSeconds,_that.fraction);case MeasurementProgressCompleted():
return completed(_that.totalSeconds);case MeasurementProgressFailed():
return failed(_that.message,_that.code,_that.elapsedSeconds);case MeasurementProgressIdle():
return idle();case _:
  throw StateError('Unexpected subclass');

}
}