|
|
|
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;
|
|
|
|
final double? width;
|
|
|
|
final double? height;
|
|
|
|
final BoxFit fit;
|
|
|
|
final bool isCircle;
|
|
|
|
final bool noCompress;//不压缩图片
|
|
|
|
|
|
|
|
final double scaleIndex = 1.5;
|
|
|
|
|
|
|
|
const 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,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|