You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.0 KiB
134 lines
4.0 KiB
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 = 2.5; |
|
|
|
MImage( |
|
this.src, { |
|
this.errorSrc = "assets/image/default_2_1.webp", |
|
this.fadeSrc = "assets/image/default_2_1.webp", |
|
this.aspectRatio, |
|
this.width, |
|
this.height, |
|
this.fit, |
|
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); |
|
} |
|
|
|
@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")) { |
|
if(noCompress) |
|
imageUrl = src; |
|
else |
|
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.webp", |
|
fit: fit, |
|
); |
|
} |
|
Widget cachedNetworkImage; |
|
if (src.startsWith("http")) { |
|
cachedNetworkImage = Image( |
|
image: ResizeImage(NetworkToFileImage( |
|
url: imageUrl, |
|
file: fileFromDocsDir("resize"+(noCompress?"noCompress":"$_w$_h")+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, |
|
); |
|
} |
|
} |
|
}
|
|
|