ub3lal 3 semanas atrás
pai
commit
61dd85ee01

+ 7 - 1
lib/src/CashedNetworkImageWidget.dart

@@ -23,6 +23,7 @@ typedef ImageWidgetBuilder =
 class CachedNetworkImageWidget extends StatefulWidget {
   final String imageUrl;
   final int count;
+  final bool isDebug;
   final bool useUrl = false;
   final double? width;
   final double? height;
@@ -39,6 +40,7 @@ class CachedNetworkImageWidget extends StatefulWidget {
     required this.imageUrl,
     required this.cacheKey,
     this.count = 10,
+    this.isDebug = kDebugMode,
     this.height,
     this.width,
     this.errorWidget,
@@ -68,6 +70,7 @@ class CachedNetworkImageWidgetState extends State<CachedNetworkImageWidget>
         url: widget.imageUrl,
         cached: widget.cached,
         count: widget.count,
+        isDebug: widget.isDebug,
         cachkey: widget.cacheKey,
       ),
     );
@@ -121,6 +124,7 @@ class CachedNetworkImageProvider
     extends ImageProvider<CachedNetworkImageProvider> {
   final String imageUrl;
   final int count;
+  final bool isDebug;
   final BoxFit fit;
   final double? width;
   final double? height;
@@ -136,6 +140,7 @@ class CachedNetworkImageProvider
     required this.cacheKey,
     required this.fit,
     this.count = 10,
+    this.isDebug = kDebugMode,
     this.height,
     this.width,
     this.errorWidget,
@@ -173,6 +178,7 @@ class CachedNetworkImageProvider
       HttpGetImage httpGetImage = HttpGetImage(
         url: imageUrl,
         count: count,
+        isDebug: isDebug,
         httpHeaders: httpHeaders,
       );
       // 2. Декодируем байты в ui.Image
@@ -201,7 +207,7 @@ class CachedNetworkImageProvider
       }
       Uint8List img;
       try {
-        img = await httpGetImage.getDataObjectIsolate();
+        img = await httpGetImage.getData();
         if (cached) {
           DefaulFileManager defaulFileManager = await DefaulFileManager.init();
           if (cacheKey != null) {

+ 2 - 1
lib/src/bloc/cashed_image_bloc.dart

@@ -19,6 +19,7 @@ class CashedImageBloc extends Bloc<CashedImageEvent, CashedImageState> {
       HttpGetImage httpGetImage = HttpGetImage(
         url: event.url,
         count: event.count,
+        isDebug: event.isDebug,
         httpHeaders: event.httpHeaders,
       );
       if (event.cached) {
@@ -62,7 +63,7 @@ class CashedImageBloc extends Bloc<CashedImageEvent, CashedImageState> {
       }
 
       try {
-        Uint8List uint8list = await httpGetImage.getDataObjectIsolate();
+        Uint8List uint8list = await httpGetImage.getData();
         if (event.cached) {
           DefaulFileManager defaulFileManager = await DefaulFileManager.init();
           if (event.cachkey != null) {

+ 2 - 0
lib/src/bloc/cashed_image_event.dart

@@ -11,6 +11,7 @@ class GetStartImageEvent extends CashedImageEvent {
   final String url;
   final bool cached;
   final int count;
+  final bool isDebug;
   final String? cachkey;
   final bool useUrl;
   final Map<String, String>? httpHeaders;
@@ -18,6 +19,7 @@ class GetStartImageEvent extends CashedImageEvent {
     required this.url,
     required this.cached,
     required this.count,
+    required this.isDebug,
     required this.cachkey,
     required this.httpHeaders,
     required this.useUrl,

+ 42 - 7
lib/src/http_request.dart

@@ -6,14 +6,37 @@ import 'package:http/http.dart' as http;
 class HttpGetImage {
   final String url;
   final int count;
+  final bool isDebug;
   final Map<String, String>? httpHeaders;
 
   HttpGetImage({
     required this.url,
     required this.count,
+    required this.isDebug,
     required this.httpHeaders,
   });
 
+  // Единая точка входа: в дебаге бьём запрос напрямую, в релизе — через изолят
+  Future<Uint8List> getData() {
+    if (isDebug) {
+      return _getDataDirect();
+    }
+    return getDataObjectIsolate();
+  }
+
+  Future<Uint8List> _getDataDirect() async {
+    final Uint8List? result = await _fetchWithRetry(
+      url: url,
+      count: count,
+      headers: httpHeaders,
+    );
+
+    if (result != null) {
+      return result;
+    }
+    throw Exception("Failed to load image bytes or received null");
+  }
+
   Future<Uint8List> getDataObjectIsolate() async {
     final ReceivePort receivePort = ReceivePort();
 
@@ -49,6 +72,21 @@ class HttpGetImage {
     final Map<String, String>? headers =
         message['headers'] as Map<String, String>?;
 
+    final Uint8List? result = await _fetchWithRetry(
+      url: url,
+      count: count,
+      headers: headers,
+    );
+
+    sendPort.send(result);
+  }
+
+  // Общая логика ретраев: используется и в изоляте, и при прямом вызове в дебаге
+  static Future<Uint8List?> _fetchWithRetry({
+    required String url,
+    required int count,
+    required Map<String, String>? headers,
+  }) async {
     int time = 10;
 
     // Заменяем do-while на контролируемый цикл по попыткам
@@ -64,16 +102,14 @@ class HttpGetImage {
               final data = jsonDecode(response.body);
               if (data is Map) {
                 // Если пришел JSON вместо сырых байт картинки
-                sendPort.send(null);
-                return;
+                return null;
               }
             } catch (_) {
               // Если это не JSON (значит, скорее всего, чистые байты картинки) — всё отлично
             }
           }
 
-          sendPort.send(response.bodyBytes);
-          return; // Успешно выходим из функции
+          return response.bodyBytes; // Успешно возвращаем результат
         }
 
         // Если код не 200 (например 500), увеличиваем таймаут и пробуем снова
@@ -83,13 +119,12 @@ class HttpGetImage {
         // В дебаге это частая история. Увеличиваем время и идем на следующую итерацию.
         time++;
         if (time > count) {
-          sendPort.send(null);
-          return;
+          return null;
         }
       }
     }
 
     // Если превысили лимит count и ничего не вернули
-    sendPort.send(null);
+    return null;
   }
 }