From af1e865d05142502702c2b186a996c8c8479b72e Mon Sep 17 00:00:00 2001
From: rafaelbarbsoatec <rafaelbarbosatec@gmail.com>
Date: Fri, 26 Jan 2024 16:27:09 -0300
Subject: [PATCH] TiledNetworkReader improvements

---
 lib/tiled/reader/tiled_network_reader.dart | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/tiled/reader/tiled_network_reader.dart b/lib/tiled/reader/tiled_network_reader.dart
index b561c0195..0be0749d4 100644
--- a/lib/tiled/reader/tiled_network_reader.dart
+++ b/lib/tiled/reader/tiled_network_reader.dart
@@ -13,6 +13,7 @@ import 'package:tiledjsonreader/tile_set/tile_set_item.dart';
 class TiledNetworkReader extends TiledReader {
 // ignore: constant_identifier_names
   static const ORIENTATION_SUPPORTED = 'orthogonal';
+  static const _keyImgBase64 = 'base64';
   final Uri uri;
   final TiledCacheProvider cache;
   @override
@@ -119,19 +120,26 @@ class TiledNetworkReader extends TiledReader {
 
   Future<void> _fetchTilesetImage(String sourceBasePath, String image) async {
     final url = '$basePath$sourceBasePath$image';
-    if (!Flame.images.containsKey(url)) {
-      final response = await http.get(Uri.parse(url));
-      String img64 = base64Encode(response.bodyBytes);
-      await Flame.images.fromBase64(url, img64);
-    }
+    return _loadImage(url);
   }
 
   Future<void> _fetchLayerImage(MapLayer layer) async {
     if (layer is ImageLayer) {
       final url = '$basePath${layer.image}';
-      if (!Flame.images.containsKey(url)) {
+      return _loadImage(url);
+    }
+  }
+
+  Future<void> _loadImage(String url) async {
+    if (!Flame.images.containsKey(url)) {
+      bool containCache = await cache.containsKey(url);
+      if (containCache) {
+        String base64 = (await cache.get(url))[_keyImgBase64];
+        await Flame.images.fromBase64(url, base64);
+      } else {
         final response = await http.get(Uri.parse(url));
         String img64 = base64Encode(response.bodyBytes);
+        cache.put(url, {_keyImgBase64: img64});
         await Flame.images.fromBase64(url, img64);
       }
     }