import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:chat/configs/app_colors.dart'; import 'package:chat/constants/message_constant.dart'; import 'package:chat/views/conversation/preview/image_widget.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_image.dart'; import 'package:tencent_im_sdk_plugin/models/v2_tim_message.dart'; class ShowImageMessage extends StatelessWidget { final V2TimMessage message; const ShowImageMessage(this.message, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Container( decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(4)), ), constraints: BoxConstraints( maxWidth: Get.width * 0.362, minWidth: 64, maxHeight: 192, ), clipBehavior: Clip.hardEdge, child: _imageBuilder(), ); } Widget _imageBuilder() { var path = message.imageElem!.path!; var list = message.imageElem!.imageList!; V2TimImage? small = list.where((e) => e!.type == 2).first; V2TimImage? big = list.where((e) => e!.type == 1).first; V2TimImage? original = list.where((e) => e!.type == 0).first; /// 如果是从本机发出去的图片消息,并且图片还存在的情况 if (path.isNotEmpty && File(path).existsSync()) { return _showLocalImageFile(path, original!.localUrl!); } else if (small != null && File(small.localUrl!).existsSync()) { return _showLocalImageFile(small.localUrl!, original!.localUrl!); } else if (big != null && File(big.localUrl!).existsSync()) { return _showLocalImageFile(big.localUrl!, original!.localUrl!); } else if (original != null && File(original.localUrl!).existsSync()) { return _showLocalImageFile(original.localUrl!, original.localUrl!); } else { return GestureDetector( onTap: () { Get.to( PreviewImageWidget( type: IMG_PREVIEW_TYPE.url, path: big!.url!, original: original!.url!, ), transition: Transition.zoom, ); }, child: CachedNetworkImage( imageUrl: small!.url!, cacheKey: 'CHAT_IMAGE', alignment: Alignment.topCenter, errorWidget: (context, error, stackTrace) => _errorDisplay(), ), ); } } Widget _showLocalImageFile(String path, String original) { return GestureDetector( onTap: () { Get.to( PreviewImageWidget( type: IMG_PREVIEW_TYPE.local, path: path, original: original, ), transition: Transition.zoom, ); }, child: Image.file( File(path), fit: BoxFit.fitWidth, ), ); } Widget _errorDisplay() { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), border: Border.all( width: 0.4, color: AppColors.unactive, ), ), height: 96, child: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: const [ Icon( Icons.warning_amber_outlined, size: 20, color: AppColors.unactive, ), SizedBox(width: 4), Text( '图片加载失败', style: TextStyle( color: AppColors.unactive, fontSize: 12, ), ), ], ), ), ); } }