|
|
|
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;
|
|
|
|
|
|
|
|
double scaleIndex = 2.5;
|
|
|
|
|
|
|
|
MImage(
|
|
|
|
this.src, {
|
|
|
|
this.errorSrc = "assets/image/default_2_1.png",
|
|
|
|
this.fadeSrc = "assets/image/default_2_1.png",
|
|
|
|
this.aspectRatio,
|
|
|
|
this.width,
|
|
|
|
this.height,
|
|
|
|
this.fit,
|
|
|
|
this.isCircle = false,
|
|
|
|
this.radius = BorderRadius.zero,
|
|
|
|
});
|
|
|
|
|
|
|
|
File fileFromDocsDir(String filename) {
|
|
|
|
String pathName = p.join(ImgCachePath.instance.path, filename);
|
|
|
|
return File(pathName);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
Widget image = LayoutBuilder(
|
|
|
|
builder: (context, constraints) {
|
|
|
|
String imageUrl = "";
|
|
|
|
///压缩图片
|
|
|
|
// if (src != null && src != "" && src.startsWith("http")) {
|
|
|
|
// String oper = src.contains("?") ? "" :"?";
|
|
|
|
// imageUrl =
|
|
|
|
// "$src$oper/imageMogr2/thumbnail/${constraints.constrainWidth() * scaleIndex}"
|
|
|
|
// "x${constraints.constrainHeight() * scaleIndex}/format/webp/quality/100";
|
|
|
|
// }
|
|
|
|
int _w = ((constraints.constrainWidth()==double.infinity?
|
|
|
|
MediaQuery.of(context).size.width:constraints.constrainWidth()) * scaleIndex).toInt();
|
|
|
|
int _h = ((constraints.constrainHeight()==double.infinity?
|
|
|
|
MediaQuery.of(context).size.height:constraints.constrainHeight()) * scaleIndex).toInt();
|
|
|
|
///压缩图片
|
|
|
|
if ((src??"").startsWith("http")) {
|
|
|
|
imageUrl = "$src?imageView2/1/w/${_w}/h/${_h}/format/jpg/q/75";
|
|
|
|
}
|
|
|
|
|
|
|
|
// print("imageUrl:$imageUrl");
|
|
|
|
// print("constrainWidth: ${constraints.constrainWidth()}");
|
|
|
|
// print("constrainHeight: ${constraints.constrainHeight()}");
|
|
|
|
|
|
|
|
if (imageUrl == null || imageUrl == "") {
|
|
|
|
return Image.asset(
|
|
|
|
"assets/image/default_2_1.png",
|
|
|
|
fit: fit,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
Widget cachedNetworkImage;
|
|
|
|
if (src.startsWith("http")) {
|
|
|
|
cachedNetworkImage = Image(
|
|
|
|
image: ResizeImage(NetworkToFileImage(
|
|
|
|
url: imageUrl,
|
|
|
|
file: fileFromDocsDir("resize"+src.replaceAll("https:", "")
|
|
|
|
.replaceAll("http:", "")
|
|
|
|
.replaceAll("pos.upload.gznl.top", "")
|
|
|
|
.replaceAll("/", "")),
|
|
|
|
debug: true,
|
|
|
|
),
|
|
|
|
width: _w,
|
|
|
|
height: _h),
|
|
|
|
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;
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
var clipRRect;
|
|
|
|
if (isCircle) {
|
|
|
|
clipRRect = ClipOval(clipBehavior: Clip.antiAlias, child: image);
|
|
|
|
} else {
|
|
|
|
clipRRect = ClipRRect(
|
|
|
|
borderRadius: radius,
|
|
|
|
child: image,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (aspectRatio != null && aspectRatio > 0) {
|
|
|
|
return Container(
|
|
|
|
child: AspectRatio(
|
|
|
|
aspectRatio: aspectRatio,
|
|
|
|
child: clipRRect,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return Container(
|
|
|
|
width: width,
|
|
|
|
height: height,
|
|
|
|
child: clipRRect,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|