import 'dart:io'; import 'package:flutter/material.dart'; import 'package:huixiang/utils/ImgCachePath.dart'; import 'package:network_to_file_image/network_to_file_image.dart'; import 'package:path/path.dart' as p; class MImage extends StatelessWidget { final String src; final String errorSrc; final String fadeSrc; final BorderRadius radius; final double aspectRatio; double? width; double? height; final BoxFit fit; final bool isCircle; final bool noCompress;//不压缩图片 double scaleIndex = 1.5; MImage( this.src, { this.errorSrc = "assets/image/default_2_1.webp", this.fadeSrc = "assets/image/default_2_1.webp", this.aspectRatio = 0, this.width, this.height, this.fit = BoxFit.cover, this.isCircle = false, this.noCompress = false, this.radius = BorderRadius.zero, }); File fileFromDocsDir(String filename) { String pathName = p.join(ImgCachePath.instance.path, filename); return File(pathName); } double getImageWidth(context, double widgetWidth) { double width = MediaQuery.of(context).size.width; if (widgetWidth > 700) { return width; } else if (widgetWidth > 300) { return 700; } else { return 300; } } double getImageHeight(context, double widgetHeight) { if (widgetHeight > 700) { return 1000; } else if (widgetHeight > 300) { return 700; } else { return 300; } } @override Widget build(BuildContext context) { Widget image = LayoutBuilder( builder: (ctx, constraints) { String? imageUrl = ""; ///压缩图片 int _w = ((getImageWidth(ctx, constraints.constrainWidth())) * scaleIndex).toInt(); int _h = ((getImageHeight(ctx, constraints.constrainHeight())) * scaleIndex).toInt(); ///压缩图片 if (src.startsWith("http")) { if (noCompress) { imageUrl = src; } else { imageUrl = "$src?imageView2/0/w/${_w}/format/jpg/q/100"; } } // debugPrint("imageUrl: $imageUrl"); if (imageUrl.isEmpty) { return Image.asset( "assets/image/default_2_1.webp", fit: fit, ); } Widget? cachedNetworkImage; if (src.startsWith("http")) { cachedNetworkImage = Image( image: NetworkToFileImage( url: imageUrl, file: fileFromDocsDir("resize${(noCompress?"noCompress":"$_w$_h")}${src.replaceAll("https:", "") .replaceAll("http:", "") .replaceAll("pos.upload.gznl.top", "") .replaceAll("/", "")}"), debug: true, ), errorBuilder: (context, error, stackTrace) { return Image.asset( errorSrc, fit: fit, ); }, fit: fit, ); } else if (src.startsWith("file")) { cachedNetworkImage = Image.file( File(src), fit: fit, errorBuilder: (context, error, stackTrace) { return Image.asset( errorSrc, fit: fit, ); }, ); } return cachedNetworkImage ?? Image.asset( "assets/image/default_2_1.webp", fit: fit, ); }, ); var clipRRect; if (isCircle) { clipRRect = ClipOval(clipBehavior: Clip.antiAlias, child: image); } else { clipRRect = ClipRRect( borderRadius: radius, child: image, ); } if (aspectRatio > 0) { return SizedBox( width: width, height: height, child: AspectRatio( aspectRatio: aspectRatio, child: clipRRect, ), ); } else { return SizedBox( width: width, height: height, child: clipRRect, ); } } }