From e1ee626a0c023d62df757071e8a77234ceeb8797 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 29 Sep 2024 14:01:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A7=81=E4=BF=A1=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/whisper/view.dart | 17 +++--- lib/pages/whisper_detail/controller.dart | 13 +++++ lib/pages/whisper_detail/view.dart | 28 ++++------ .../whisper_detail/widget/chat_item.dart | 54 +++++++++++++++++-- 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 7082619f..e97aa79b 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -217,6 +217,7 @@ class SessionItem extends StatelessWidget { final String heroTag = Utils.makeHeroTag(sessionItem.accountInfo?.mid ?? 0); final content = sessionItem.lastMsg.content; final msgStatus = sessionItem.lastMsg.msgStatus; + final int msgType = sessionItem.lastMsg.msgType; return ListTile( onTap: () { @@ -251,13 +252,15 @@ class SessionItem extends StatelessWidget { subtitle: Text( msgStatus == 1 ? '你撤回了一条消息' - : content != null && content != '' - ? (content['text'] ?? - content['content'] ?? - content['title'] ?? - content['reply_content'] ?? - '不支持的消息类型') - : '不支持的消息类型', + : msgType == 2 + ? '[图片]' + : content != null && content != '' + ? (content['text'] ?? + content['content'] ?? + content['title'] ?? + content['reply_content'] ?? + '不支持的消息类型') + : '不支持的消息类型', maxLines: 1, overflow: TextOverflow.ellipsis, style: Theme.of(context) diff --git a/lib/pages/whisper_detail/controller.dart b/lib/pages/whisper_detail/controller.dart index 32e0ceb0..ec828afb 100644 --- a/lib/pages/whisper_detail/controller.dart +++ b/lib/pages/whisper_detail/controller.dart @@ -22,6 +22,7 @@ class WhisperDetailController extends GetxController { final TextEditingController replyContentController = TextEditingController(); Box userInfoCache = GStrorage.userInfo; List emoteList = []; + List picList = []; @override void onInit() { @@ -41,6 +42,18 @@ class WhisperDetailController extends GetxController { var res = await MsgHttp.sessionMsg(talkerId: talkerId); if (res['status']) { messageList.value = res['data'].messages; + // 找出图片 + try { + for (var item in messageList) { + if (item.msgType == 2) { + picList.add(item.content['url']); + } + } + picList = picList.reversed.toList(); + } catch (e) { + print('e: $e'); + } + if (messageList.isNotEmpty) { ackSessionMsg(); if (res['data'].eInfos != null) { diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index 912b5dc5..3ea59343 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -193,27 +193,21 @@ class _WhisperDetailPageState extends State ? const SizedBox() : Align( alignment: Alignment.topCenter, - child: ListView.builder( + child: ListView.separated( itemCount: messageList.length, shrinkWrap: true, reverse: true, itemBuilder: (_, int i) { - if (i == 0) { - return Column( - children: [ - ChatItem( - item: messageList[i], - e_infos: _whisperDetailController - .eInfos), - const SizedBox(height: 20), - ], - ); - } else { - return ChatItem( - item: messageList[i], - e_infos: - _whisperDetailController.eInfos); - } + return ChatItem( + item: messageList[i], + e_infos: _whisperDetailController.eInfos, + ctr: _whisperDetailController, + ); + }, + separatorBuilder: (_, int i) { + return i == 0 + ? const SizedBox(height: 20) + : const SizedBox.shrink(); }, ), ), diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 94347aff..7ddd1d83 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -2,14 +2,18 @@ // ignore_for_file: constant_identifier_names import 'dart:convert'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; +import 'package:pilipala/plugin/pl_gallery/hero_dialog_route.dart'; +import 'package:pilipala/plugin/pl_gallery/interactiveviewer_gallery.dart'; import 'package:pilipala/utils/route_push.dart'; import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/storage.dart'; import '../../../http/search.dart'; +import '../controller.dart'; enum MsgType { invalid(value: 0, label: "空空的~"), @@ -42,10 +46,12 @@ enum MsgType { class ChatItem extends StatelessWidget { dynamic item; List? e_infos; + WhisperDetailController ctr; ChatItem({ super.key, - this.item, + required this.item, + required this.ctr, this.e_infos, }); @@ -157,10 +163,48 @@ class ChatItem extends StatelessWidget { case MsgType.text: return richTextMessage(context); case MsgType.pic: - return NetworkImgLayer( - width: 220, - height: 220 * content['height'] / content['width'], - src: content['url'], + return InkWell( + onTap: () { + Navigator.of(context).push( + HeroDialogRoute( + builder: (BuildContext context) => InteractiveviewerGallery( + sources: ctr.picList, + initIndex: ctr.picList.indexOf(content['url']), + itemBuilder: ( + BuildContext context, + int index, + bool isFocus, + bool enablePageView, + ) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (enablePageView) { + Navigator.of(context).pop(); + } + }, + child: Center( + child: Hero( + tag: ctr.picList[index], + child: CachedNetworkImage( + fadeInDuration: const Duration(milliseconds: 0), + imageUrl: ctr.picList[index], + fit: BoxFit.contain, + ), + ), + ), + ); + }, + onPageChanged: (int pageIndex) {}, + ), + ), + ); + }, + child: NetworkImgLayer( + width: 220, + height: 220 * content['height'] / content['width'], + src: content['url'], + ), ); case MsgType.share_v2: return Column(