191 lines
5.6 KiB
Dart
191 lines
5.6 KiB
Dart
import 'dart:io';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:baseproject/assets/images.dart';
|
|
import 'package:baseproject/core/common/utils.dart';
|
|
import 'package:baseproject/core/components/image/show_image.dart';
|
|
import 'package:baseproject/features/presentation/app/view/app.dart';
|
|
import 'package:cached_network_image/cached_network_image.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
|
import 'package:flutter_svg/svg.dart';
|
|
|
|
// ignore: non_constant_identifier_names
|
|
Widget CustomImage({
|
|
String? imageUrl,
|
|
BoxFit? fit,
|
|
Widget? imageDefault,
|
|
File? file,
|
|
Uint8List? data,
|
|
double? width,
|
|
double? height,
|
|
double? radius,
|
|
Color? color,
|
|
bool isCrop = true,
|
|
bool isShowLoading = true,
|
|
bool viewImage = false,
|
|
String imageCropMode = 'crop',
|
|
ImageRepeat repeat = ImageRepeat.noRepeat,
|
|
}) {
|
|
var isViewImage = viewImage;
|
|
if (imageUrl != null && imageUrl.trim().isNotEmpty) {
|
|
if (imageUrl.contains("http")) {
|
|
switch (getMediaType(imageUrl)) {
|
|
default:
|
|
return GestureDetector(
|
|
onTap: () {
|
|
isViewImage == false ? null : showImage(navigatorKey!.currentState!.context, imageUrl);
|
|
},
|
|
child: CachedNetworkImage(
|
|
repeat: repeat,
|
|
imageUrl: isCrop
|
|
? Utils.thumbnailImage(imageUrl, width: width, height: height, mode: imageCropMode)
|
|
: imageUrl,
|
|
width: width,
|
|
height: height,
|
|
imageBuilder: (width != null && height != null)
|
|
? (BuildContext context, ImageProvider _imageUrl) {
|
|
return Container(
|
|
width: width,
|
|
height: height,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(radius ?? 0),
|
|
image: DecorationImage(
|
|
image: imageUrl.contains('.gif') ? NetworkImage(imageUrl) : _imageUrl,
|
|
fit: fit ?? BoxFit.contain),
|
|
),
|
|
// child: Image.network(imageUrl, fit: fit ?? BoxFit.contain),
|
|
);
|
|
}
|
|
: null,
|
|
placeholder: (_, __) => isShowLoading
|
|
? const SpinKitCircle(
|
|
color: Colors.white,
|
|
size: 50.0,
|
|
)
|
|
: const SizedBox(),
|
|
fit: fit,
|
|
errorWidget: (_, __, dynamic error) {
|
|
isViewImage = false;
|
|
return imageDefault ?? _buildImageDefault(fit, width, height, radius);
|
|
}),
|
|
);
|
|
}
|
|
} else if (imageUrl.contains('data')) {
|
|
return Image.file(
|
|
File(imageUrl),
|
|
fit: fit,
|
|
width: width,
|
|
height: height,
|
|
repeat: repeat,
|
|
);
|
|
} else {
|
|
return Image.asset(
|
|
imageUrl,
|
|
fit: fit,
|
|
width: width,
|
|
height: height,
|
|
color: color,
|
|
repeat: repeat,
|
|
);
|
|
}
|
|
} else if (file != null) {
|
|
return Image.file(
|
|
file,
|
|
fit: fit,
|
|
width: width,
|
|
height: height,
|
|
repeat: repeat,
|
|
);
|
|
} else if (data != null) {
|
|
return Image.memory(
|
|
data,
|
|
fit: fit,
|
|
width: width,
|
|
height: height,
|
|
repeat: repeat,
|
|
);
|
|
}
|
|
|
|
return imageDefault ?? _buildImageDefault(fit, width, height, radius);
|
|
}
|
|
|
|
Widget _buildImageDefault(BoxFit? fit, double? width, double? height, double? radius) {
|
|
return Container(
|
|
width: width,
|
|
height: height,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(radius ?? 0),
|
|
image: DecorationImage(
|
|
image: const AssetImage(Images.imageDefault),
|
|
fit: fit ?? BoxFit.contain,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
MediaType getMediaType(String path) {
|
|
if (getVideo(path)) {
|
|
return MediaType.mp4;
|
|
} else if (path.contains('http')) {
|
|
if (path.contains('sticker')) {
|
|
return MediaType.sticker;
|
|
} else if (path.contains('svg')) {
|
|
return MediaType.svgNetwork;
|
|
} else if (path.contains('jpg') ||
|
|
path.contains('jpeg') ||
|
|
path.contains('JPG') ||
|
|
path.contains('png') ||
|
|
path.contains('.gif')) {
|
|
return MediaType.jpgNetwork;
|
|
} else if (path.contains('mp4')) {
|
|
return MediaType.mp4;
|
|
}
|
|
return MediaType.file;
|
|
} else if (path.contains("data")) {
|
|
return MediaType.file;
|
|
} else if (path.contains('svg')) {
|
|
return MediaType.svgLocal;
|
|
} else if (path.contains('png') || path.contains('jpg') || path.contains('JPG') || path.contains('jpeg')) {
|
|
return MediaType.pngLocal;
|
|
}
|
|
return MediaType.waiting;
|
|
}
|
|
|
|
enum MediaType { mp4, svgLocal, svgNetwork, pngLocal, pngNetwork, jpgNetwork, file, waiting, sticker }
|
|
|
|
bool getVideo(String path) =>
|
|
path.contains("mp4") || path.contains("MP4") || path.contains("MOV") || path.contains("mov");
|
|
|
|
Widget svgImage(String path,
|
|
{Color? color,
|
|
double? width,
|
|
double? height,
|
|
bool cacheColorFilter = false,
|
|
BoxFit fit = BoxFit.contain,
|
|
String? package}) {
|
|
if (path.contains("http")) {
|
|
if (path.contains('jpg') || path.contains('png')) {
|
|
return CustomImage(imageUrl: path, width: width, height: height, fit: fit);
|
|
}
|
|
return SvgPicture.network(
|
|
path,
|
|
cacheColorFilter: cacheColorFilter,
|
|
color: color,
|
|
width: width,
|
|
height: height,
|
|
fit: fit,
|
|
);
|
|
}
|
|
|
|
return SvgPicture.asset(
|
|
path,
|
|
cacheColorFilter: cacheColorFilter,
|
|
color: color,
|
|
width: width,
|
|
height: height,
|
|
fit: fit,
|
|
package: package,
|
|
);
|
|
}
|