when<TResult extends Object?> method

  1. @optionalTypeArgs
TResult when<TResult extends Object?>({
  1. required TResult network(
    1. String url,
    2. ImageParams params
    ),
  2. required TResult base64(
    1. String base64Code,
    2. ImageParams params
    ),
  3. required TResult filePath(
    1. String filePath,
    2. ImageParams params
    ),
  4. required TResult asset(
    1. String assetPath,
    2. ImageParams params
    ),
})

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(String url, ImageParams params) network,
  required TResult Function(String base64Code, ImageParams params) base64,
  required TResult Function(String filePath, ImageParams params) filePath,
  required TResult Function(String assetPath, ImageParams params) asset,
}) {
  final _that = this;
  switch (_that) {
    case MyNetworkImage():
      return network(_that.url, _that.params);
    case MyBase64Image():
      return base64(_that.base64Code, _that.params);
    case MyFilePathImage():
      return filePath(_that.filePath, _that.params);
    case MyAssetImage():
      return asset(_that.assetPath, _that.params);
  }
}