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.
94 lines
2.4 KiB
94 lines
2.4 KiB
import 'package:cached_network_image/cached_network_image.dart'; |
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart'; |
|
import 'package:flutter/material.dart'; |
|
|
|
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; |
|
|
|
double scaleIndex = 3.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, |
|
}); |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
Widget image = LayoutBuilder(builder: (context, constraints) { |
|
String imageUrl = ""; |
|
if (src != null && src != "") { |
|
imageUrl = "$src?imageMogr2/thumbnail/${constraints.constrainWidth() * scaleIndex}" |
|
"x${constraints.constrainHeight() * scaleIndex}/format/webp/blur/1x0/quality/75"; |
|
} |
|
if (imageUrl == null || imageUrl == "") { |
|
return Image.asset( |
|
"assets/image/default_2_1.png", |
|
fit: fit, |
|
); |
|
} |
|
return CachedNetworkImage( |
|
imageUrl: imageUrl, |
|
cacheManager: DefaultCacheManager(), |
|
fadeInDuration: Duration(milliseconds: 300), |
|
fadeOutDuration: Duration(milliseconds: 300), |
|
imageBuilder: (context, provide) { |
|
return Image( |
|
image: provide, |
|
fit: fit, |
|
); |
|
}, |
|
errorWidget: (context, error, stackTrace) { |
|
return Image.asset( |
|
errorSrc, |
|
fit: fit, |
|
); |
|
}, |
|
placeholder: (context, placeholder) { |
|
return Image.asset( |
|
fadeSrc, |
|
fit: fit, |
|
); |
|
}, |
|
); |
|
}); |
|
|
|
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, |
|
); |
|
} |
|
} |
|
}
|
|
|