1
0

CachedNetworkImageProvider.dart 2.4 KB

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