obtainKey method

  1. @override
Future<ResizeImageKey> obtainKey(
  1. ImageConfiguration configuration
)
override

Converts an ImageProvider's settings plus an ImageConfiguration to a key that describes the precise image to load.

The type of the key is determined by the subclass. It is a value that unambiguously identifies the image (including its scale) that the loadImage method will fetch. Different ImageProviders given the same constructor arguments and ImageConfiguration objects should return keys that are '==' to each other (possibly by using a class for the key that itself implements ==).

If the result can be determined synchronously, this function should return a SynchronousFuture. This allows image resolution to progress synchronously during a frame rather than delaying image loading.

Implementation

@override
Future<ResizeImageKey> obtainKey(ImageConfiguration configuration) {
  Completer<ResizeImageKey>? completer;
  // If the imageProvider.obtainKey future is synchronous, then we will be able to fill in result with
  // a value before completer is initialized below.
  SynchronousFuture<ResizeImageKey>? result;
  imageProvider.obtainKey(configuration).then((Object key) {
    if (completer == null) {
      // This future has completed synchronously (completer was never assigned),
      // so we can directly create the synchronous result to return.
      result = SynchronousFuture<ResizeImageKey>(ResizeImageKey._(key, policy, width, height, allowUpscaling));
    } else {
      // This future did not synchronously complete.
      completer.complete(ResizeImageKey._(key, policy, width, height, allowUpscaling));
    }
  });
  if (result != null) {
    return result!;
  }
  // If the code reaches here, it means the imageProvider.obtainKey was not
  // completed sync, so we initialize the completer for completion later.
  completer = Completer<ResizeImageKey>();
  return completer.future;
}