import 'dart:ui' as ui; import 'package:flutter/services.dart'; class Assets { final _Table _images = _Table((name) async { final assetImageByteData = await rootBundle.load(name); final codec = await ui.instantiateImageCodec(assetImageByteData.buffer.asUint8List()); final image = (await codec.getNextFrame()).image; return image; }); ui.Image? getImageIfAvailable(String name) { return _images.getIfAvailable(name); } } class _Table { final Map _loaded = {}; final Set _waiting = {}; final Future Function(String) _getAsync; _Table(this._getAsync); T? getIfAvailable(String name) { if (!_waiting.contains(name)) { _waiting.add(name); _spawnGetAsync(name); } return _loaded[name]; } Future _spawnGetAsync(String name) async { final asset = await _getAsync(name); _loaded[name] = asset; } } final assets = Assets(); ui.Image? getImageIfAvailable(String name) { return assets.getImageIfAvailable(name); }