app_net_image.dart 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:io';
  2. import 'package:f_cache/f_cache.dart';
  3. import 'package:flutter/material.dart';
  4. import '../logger.dart';
  5. import 'image_loading.dart';
  6. import '../model/m_net_image.dart';
  7. import 'package:http/http.dart' as http;
  8. class AppNetImage extends StatefulWidget{
  9. const AppNetImage({
  10. super.key,
  11. required this.netImage,
  12. this.fit,
  13. this.onWidgetOk, this.width, this.height
  14. });
  15. final MNetImage netImage;
  16. final BoxFit? fit;
  17. final VoidCallback? onWidgetOk;
  18. final double? width;
  19. final double? height;
  20. @override
  21. State<StatefulWidget> createState() {
  22. return _AppNetImageState();
  23. }
  24. }
  25. CachedReaderImage cachedProvider(MNetImage image){
  26. return CachedReaderImage(image.md5Hex ?? '', image.readerBuilder);
  27. }
  28. class _AppNetImageState extends State<AppNetImage>{
  29. late CachedReaderImage provider;
  30. @override
  31. void initState() {
  32. super.initState();
  33. final image = widget.netImage;
  34. provider = cachedProvider(image);
  35. }
  36. @override
  37. void didUpdateWidget(covariant AppNetImage oldWidget) {
  38. super.didUpdateWidget(oldWidget);
  39. final image = widget.netImage;
  40. provider = cachedProvider(image);
  41. }
  42. @override
  43. Widget build(BuildContext context) {
  44. return Image(
  45. image: provider,
  46. loadingBuilder: (
  47. BuildContext context,
  48. Widget child,
  49. ImageChunkEvent? loadingProgress){
  50. if(loadingProgress!= null){
  51. var p = 0.0;
  52. final all = loadingProgress.expectedTotalBytes?? 0;
  53. if(all > 0){
  54. p = loadingProgress.cumulativeBytesLoaded.toDouble() / all.toDouble();
  55. }
  56. return ImageLoading(value: p);
  57. }else{
  58. return child;
  59. }
  60. },
  61. errorBuilder: (ctx, e, trace){
  62. warn('图片加载失败: ${widget.netImage.url} md5: ${widget.netImage.md5Hex}', e);
  63. return Container(color: Colors.white, child:const Center(child: Icon(Icons.broken_image_outlined)));
  64. },
  65. width: widget.width,
  66. height: widget.height,
  67. fit: widget.fit,
  68. );
  69. }
  70. }