From 49027d74fe42d6007825b67acde917cc6d56bcae Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Tue, 19 Sep 2023 15:33:45 -0700 Subject: [PATCH] Support multiple asset types --- lib/assets.dart | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/assets.dart b/lib/assets.dart index 22ce6ef..25c3c34 100644 --- a/lib/assets.dart +++ b/lib/assets.dart @@ -3,26 +3,39 @@ import 'dart:ui' as ui; import 'package:flutter/services.dart'; class Assets { - final Map _loaded = {}; - final Set _waiting = {}; - - Future _getImageAsync(String name) async { + 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; - _loaded[name] = 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); - _getImageAsync(name); + _spawnGetAsync(name); } return _loaded[name]; } + + Future _spawnGetAsync(String name) async { + final asset = await _getAsync(name); + _loaded[name] = asset; + } } final assets = Assets();