feat: 私信图片查看
This commit is contained in:
@ -217,6 +217,7 @@ class SessionItem extends StatelessWidget {
|
|||||||
final String heroTag = Utils.makeHeroTag(sessionItem.accountInfo?.mid ?? 0);
|
final String heroTag = Utils.makeHeroTag(sessionItem.accountInfo?.mid ?? 0);
|
||||||
final content = sessionItem.lastMsg.content;
|
final content = sessionItem.lastMsg.content;
|
||||||
final msgStatus = sessionItem.lastMsg.msgStatus;
|
final msgStatus = sessionItem.lastMsg.msgStatus;
|
||||||
|
final int msgType = sessionItem.lastMsg.msgType;
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
@ -251,13 +252,15 @@ class SessionItem extends StatelessWidget {
|
|||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
msgStatus == 1
|
msgStatus == 1
|
||||||
? '你撤回了一条消息'
|
? '你撤回了一条消息'
|
||||||
: content != null && content != ''
|
: msgType == 2
|
||||||
? (content['text'] ??
|
? '[图片]'
|
||||||
content['content'] ??
|
: content != null && content != ''
|
||||||
content['title'] ??
|
? (content['text'] ??
|
||||||
content['reply_content'] ??
|
content['content'] ??
|
||||||
'不支持的消息类型')
|
content['title'] ??
|
||||||
: '不支持的消息类型',
|
content['reply_content'] ??
|
||||||
|
'不支持的消息类型')
|
||||||
|
: '不支持的消息类型',
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: Theme.of(context)
|
style: Theme.of(context)
|
||||||
|
|||||||
@ -22,6 +22,7 @@ class WhisperDetailController extends GetxController {
|
|||||||
final TextEditingController replyContentController = TextEditingController();
|
final TextEditingController replyContentController = TextEditingController();
|
||||||
Box userInfoCache = GStrorage.userInfo;
|
Box userInfoCache = GStrorage.userInfo;
|
||||||
List emoteList = [];
|
List emoteList = [];
|
||||||
|
List<String> picList = [];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@ -41,6 +42,18 @@ class WhisperDetailController extends GetxController {
|
|||||||
var res = await MsgHttp.sessionMsg(talkerId: talkerId);
|
var res = await MsgHttp.sessionMsg(talkerId: talkerId);
|
||||||
if (res['status']) {
|
if (res['status']) {
|
||||||
messageList.value = res['data'].messages;
|
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) {
|
if (messageList.isNotEmpty) {
|
||||||
ackSessionMsg();
|
ackSessionMsg();
|
||||||
if (res['data'].eInfos != null) {
|
if (res['data'].eInfos != null) {
|
||||||
|
|||||||
@ -193,27 +193,21 @@ class _WhisperDetailPageState extends State<WhisperDetailPage>
|
|||||||
? const SizedBox()
|
? const SizedBox()
|
||||||
: Align(
|
: Align(
|
||||||
alignment: Alignment.topCenter,
|
alignment: Alignment.topCenter,
|
||||||
child: ListView.builder(
|
child: ListView.separated(
|
||||||
itemCount: messageList.length,
|
itemCount: messageList.length,
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
reverse: true,
|
reverse: true,
|
||||||
itemBuilder: (_, int i) {
|
itemBuilder: (_, int i) {
|
||||||
if (i == 0) {
|
return ChatItem(
|
||||||
return Column(
|
item: messageList[i],
|
||||||
children: [
|
e_infos: _whisperDetailController.eInfos,
|
||||||
ChatItem(
|
ctr: _whisperDetailController,
|
||||||
item: messageList[i],
|
);
|
||||||
e_infos: _whisperDetailController
|
},
|
||||||
.eInfos),
|
separatorBuilder: (_, int i) {
|
||||||
const SizedBox(height: 20),
|
return i == 0
|
||||||
],
|
? const SizedBox(height: 20)
|
||||||
);
|
: const SizedBox.shrink();
|
||||||
} else {
|
|
||||||
return ChatItem(
|
|
||||||
item: messageList[i],
|
|
||||||
e_infos:
|
|
||||||
_whisperDetailController.eInfos);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -2,14 +2,18 @@
|
|||||||
// ignore_for_file: constant_identifier_names
|
// ignore_for_file: constant_identifier_names
|
||||||
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:pilipala/common/widgets/network_img_layer.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/route_push.dart';
|
||||||
import 'package:pilipala/utils/utils.dart';
|
import 'package:pilipala/utils/utils.dart';
|
||||||
import 'package:pilipala/utils/storage.dart';
|
import 'package:pilipala/utils/storage.dart';
|
||||||
import '../../../http/search.dart';
|
import '../../../http/search.dart';
|
||||||
|
import '../controller.dart';
|
||||||
|
|
||||||
enum MsgType {
|
enum MsgType {
|
||||||
invalid(value: 0, label: "空空的~"),
|
invalid(value: 0, label: "空空的~"),
|
||||||
@ -42,10 +46,12 @@ enum MsgType {
|
|||||||
class ChatItem extends StatelessWidget {
|
class ChatItem extends StatelessWidget {
|
||||||
dynamic item;
|
dynamic item;
|
||||||
List? e_infos;
|
List? e_infos;
|
||||||
|
WhisperDetailController ctr;
|
||||||
|
|
||||||
ChatItem({
|
ChatItem({
|
||||||
super.key,
|
super.key,
|
||||||
this.item,
|
required this.item,
|
||||||
|
required this.ctr,
|
||||||
this.e_infos,
|
this.e_infos,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -157,10 +163,48 @@ class ChatItem extends StatelessWidget {
|
|||||||
case MsgType.text:
|
case MsgType.text:
|
||||||
return richTextMessage(context);
|
return richTextMessage(context);
|
||||||
case MsgType.pic:
|
case MsgType.pic:
|
||||||
return NetworkImgLayer(
|
return InkWell(
|
||||||
width: 220,
|
onTap: () {
|
||||||
height: 220 * content['height'] / content['width'],
|
Navigator.of(context).push(
|
||||||
src: content['url'],
|
HeroDialogRoute<void>(
|
||||||
|
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:
|
case MsgType.share_v2:
|
||||||
return Column(
|
return Column(
|
||||||
|
|||||||
Reference in New Issue
Block a user