1
0

CachedNetworkImageProvider.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'dart:ui' as ui;
  2. import 'dart:ui';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'dart:ui' as ui;
  6. import 'package:network_image_cached/src/http_request.dart';
  7. class CachedNetworkImageProvider
  8. extends ImageProvider<CachedNetworkImageProvider> {
  9. final String imageUrl;
  10. final int count;
  11. final BoxFit fit;
  12. final double? width;
  13. final double? height;
  14. final Widget? placeholder;
  15. final Widget? errorWidget;
  16. final bool cached;
  17. final String? cachkey;
  18. final Widget? loadwidget;
  19. const CachedNetworkImageProvider({
  20. required this.imageUrl,
  21. required this.cachkey,
  22. required this.fit,
  23. this.count = 10,
  24. this.height,
  25. this.width,
  26. this.errorWidget,
  27. this.placeholder,
  28. this.cached = true,
  29. this.loadwidget = const CircularProgressIndicator(),
  30. });
  31. @override
  32. ImageStreamCompleter loadImage(
  33. CachedNetworkImageProvider key,
  34. ImageDecoderCallback decode,
  35. ) {
  36. // 1. Создаём Future, который загрузит и декодирует изображение
  37. // 2. Возвращаем ImageStreamCompleter, который управляет потоком загрузки
  38. return MultiFrameImageStreamCompleter(
  39. codec: _loadAndDecodeImage(decode),
  40. scale: 1.0,
  41. informationCollector: () => <DiagnosticsNode>[
  42. DiagnosticsProperty<CachedNetworkImageProvider>(
  43. 'Image provider',
  44. key,
  45. showName: false,
  46. ),
  47. ],
  48. );
  49. }
  50. // Вспомогательный метод: загружает байты и декодирует в ui.Image
  51. Future<ui.Codec> _loadAndDecodeImage(ImageDecoderCallback decode) async {
  52. try {
  53. // 1. Отправляем HTTP‑запрос
  54. HttpGetImage httpGetImage = HttpGetImage(url: imageUrl, count: count);
  55. // 2. Декодируем байты в ui.Image
  56. Uint8List img = await httpGetImage.getDataObjectIsolate();
  57. final decodedImage = await decode(
  58. await ImmutableBuffer.fromUint8List(img),
  59. );
  60. return decodedImage;
  61. } catch (e) {
  62. // Если ошибка — бросаем исключение (будет обработано в Image widget)
  63. throw Exception('Failed to load image: $e');
  64. }
  65. }
  66. @override
  67. Future<CachedNetworkImageProvider> obtainKey(
  68. ImageConfiguration configuration,
  69. ) {
  70. return SynchronousFuture<CachedNetworkImageProvider>(this);
  71. }
  72. }