修改置顶样式,增加同城提示和用户性别标识

This commit is contained in:
CYH 2023-07-26 14:21:13 +08:00
parent 532103fc5b
commit 6629751835
8 changed files with 221 additions and 103 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:math'; import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -307,6 +308,36 @@ class _TIMConversationState extends TIMUIKitState<TIMConversation> {
return widget.itemSlideBuilder ?? _defaultSlideBuilder; return widget.itemSlideBuilder ?? _defaultSlideBuilder;
} }
Future<List<V2TimUserFullInfo>> getUserListInfo(List<String> userIdList) async {
V2TimValueCallback<String> getLoginUserRes =
await TencentImSDKPlugin.v2TIMManager.getLoginUser();
if (getLoginUserRes.code == 0) {
//
userIdList.insert(0, getLoginUserRes.data!);// getLoginUserRes.data为查询到的登录用户的UserID
}
//
V2TimValueCallback<List<V2TimUserFullInfo>> getUsersInfoRes =
await TencentImSDKPlugin.v2TIMManager.getUsersInfo(userIDList: userIdList);//id列表
if (getUsersInfoRes.code == 0) {
//
getUsersInfoRes.data?.forEach((element) {
element.allowType;// 0: 1: 2:
element.birthday;//
element.customInfo;//
element.faceUrl;// url
element.gender;// 1: 2:
element.level;//
element.nickName;//
element.role;//
element.selfSignature;//
element.userID;// ID
});
return getUsersInfoRes.data ?? [];
}
return [];
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@ -337,111 +368,152 @@ class _TIMConversationState extends TIMUIKitState<TIMConversation> {
_model.clearScrollToConversation(); _model.clearScrollToConversation();
} }
List<String> userIdList = [];
filteredConversationList.forEach((element) {
userIdList.add(element!.userID!);
});
Widget conversationList() { Widget conversationList() {
return filteredConversationList.isNotEmpty return filteredConversationList.isNotEmpty
? ListView.builder( ? FutureBuilder<List<V2TimUserFullInfo>>(
controller: _autoScrollController, future: getUserListInfo(userIdList),
shrinkWrap: true, builder: (BuildContext context, AsyncSnapshot<List<V2TimUserFullInfo>> snapshot) {
itemCount: filteredConversationList.length, return ListView.builder(
itemBuilder: (context, index) { controller: _autoScrollController,
if (index == filteredConversationList.length - 1) { shrinkWrap: true,
if (haveMoreData) { itemCount: filteredConversationList.length,
_timuiKitConversationController.loadData(); itemBuilder: (context, index) {
if (index == filteredConversationList.length - 1) {
if (haveMoreData) {
_timuiKitConversationController.loadData();
}
}
final conversationItem = filteredConversationList[index];
final V2TimUserStatus? onlineStatus =
_friendShipViewModel.userStatusList.firstWhere(
(item) => item.userID == conversationItem?.userID,
orElse: () => V2TimUserStatus(statusType: 0));
if (widget.itemBuilder != null) {
return widget.itemBuilder!(
conversationItem!, onlineStatus);
}
final slideChildren =
_getSlideBuilder()(conversationItem!);
final isCurrent = conversationItem.conversationID ==
model.selectedConversation?.conversationID;
final isPined = conversationItem.isPinned ?? false;
V2TimUserFullInfo? userFullInfo;
bool isSameCity = false;
if (snapshot.connectionState == ConnectionState.done) {
snapshot.data!.forEach((element) {
if (element.userID == conversationItem.userID) {
userFullInfo = element;
}
});
V2TimUserFullInfo myuserFullInfo = snapshot.data!.first;
if (userFullInfo!.customInfo!.containsKey('Label')) {
var otherInfo = jsonDecode(userFullInfo!.customInfo!['Label'].toString());
var myInfo = jsonDecode(myuserFullInfo!.customInfo!['Label'].toString());
if (myInfo['city'].toString().contains(otherInfo['city'].toString())) {
isSameCity = true;
} }
} }
final conversationItem = filteredConversationList[index]; }
final V2TimUserStatus? onlineStatus =
_friendShipViewModel.userStatusList.firstWhere(
(item) => item.userID == conversationItem?.userID,
orElse: () => V2TimUserStatus(statusType: 0));
if (widget.itemBuilder != null) {
return widget.itemBuilder!(
conversationItem!, onlineStatus);
}
final slideChildren =
_getSlideBuilder()(conversationItem!);
final isCurrent = conversationItem.conversationID == Widget conversationLineItem() {
model.selectedConversation?.conversationID;
final isPined = conversationItem.isPinned ?? false; return Material(
color: Colors.transparent,
child: InkWell(
child: TIMConversationItem(
isSameCity: isSameCity,
isCurrent: isCurrent,
userInfo: userFullInfo,
isShowDraft: widget.isShowDraft,
lastMessageBuilder: widget.lastMessageBuilder,
faceUrl: conversationItem.faceUrl ?? "",
nickName: conversationItem.showName ?? "",
isDisturb: conversationItem.recvOpt != 0,
lastMsg: conversationItem.lastMessage,
isPined: isPined,
groupAtInfoList:
conversationItem.groupAtInfoList ?? [],
unreadCount: conversationItem.unreadCount ?? 0,
draftText: conversationItem.draftText,
onlineStatus: (widget.isShowOnlineStatus &&
conversationItem.userID != null &&
conversationItem.userID!.isNotEmpty)
? onlineStatus
: null,
draftTimestamp: conversationItem.draftTimestamp,
convType: conversationItem.type),
onTap: () => onTapConvItem(conversationItem),
),
);
}
Widget conversationLineItem() { return TUIKitScreenUtils.getDeviceWidget(
return Material( desktopWidget: AutoScrollTag(
color: Colors.transparent, key: ValueKey(conversationItem.conversationID),
child: InkWell( controller: _autoScrollController,
child: TIMConversationItem( index: index,
isCurrent: isCurrent, child: GestureDetector(
isShowDraft: widget.isShowDraft, onSecondaryTapDown: (details) {
lastMessageBuilder: widget.lastMessageBuilder, TUIKitWidePopup.showPopupWindow(
faceUrl: conversationItem.faceUrl ?? "", operationKey: TUIKitWideModalOperationKey
nickName: conversationItem.showName ?? "", .conversationSecondaryMenu,
isDisturb: conversationItem.recvOpt != 0, isDarkBackground: false,
lastMsg: conversationItem.lastMessage, borderRadius: const BorderRadius.all(
isPined: isPined, Radius.circular(4)),
groupAtInfoList: context: context,
conversationItem.groupAtInfoList ?? [], offset: Offset(
unreadCount: conversationItem.unreadCount ?? 0, min(
draftText: conversationItem.draftText, details.globalPosition.dx,
onlineStatus: (widget.isShowOnlineStatus && MediaQuery.of(context).size.width -
conversationItem.userID != null && 80),
conversationItem.userID!.isNotEmpty) min(
? onlineStatus details.globalPosition.dy,
: null, MediaQuery.of(context).size.height -
draftTimestamp: conversationItem.draftTimestamp, 130)),
convType: conversationItem.type), child: (onClose) => _getSecondaryMenu(
onTap: () => onTapConvItem(conversationItem), conversationItem, onClose));
},
child: conversationLineItem(),
), ),
); ),
} defaultWidget: AutoScrollTag(
key: ValueKey(conversationItem.conversationID),
return TUIKitScreenUtils.getDeviceWidget( controller: _autoScrollController,
desktopWidget: AutoScrollTag( index: index,
key: ValueKey(conversationItem.conversationID), child: Slidable(
controller: _autoScrollController, groupTag: 'conversation-list',
index: index,
child: GestureDetector(
onSecondaryTapDown: (details) {
TUIKitWidePopup.showPopupWindow(
operationKey: TUIKitWideModalOperationKey
.conversationSecondaryMenu,
isDarkBackground: false,
borderRadius: const BorderRadius.all(
Radius.circular(4)),
context: context,
offset: Offset(
min(
details.globalPosition.dx,
MediaQuery.of(context).size.width -
80),
min(
details.globalPosition.dy,
MediaQuery.of(context).size.height -
130)),
child: (onClose) => _getSecondaryMenu(
conversationItem, onClose));
},
child: conversationLineItem(), child: conversationLineItem(),
), endActionPane: ActionPane(
), extentRatio:
defaultWidget: AutoScrollTag( slideChildren.length > 2 ? 0.77 : 0.5,
key: ValueKey(conversationItem.conversationID), motion: const DrawerMotion(),
controller: _autoScrollController, children: slideChildren)),
index: index, ));
child: Slidable( });
groupTag: 'conversation-list', })
child: conversationLineItem(),
endActionPane: ActionPane(
extentRatio:
slideChildren.length > 2 ? 0.77 : 0.5,
motion: const DrawerMotion(),
children: slideChildren)),
));
})
: (widget.emptyBuilder != null : (widget.emptyBuilder != null
? widget.emptyBuilder!() ? widget.emptyBuilder!()
: Container()); : Container());

View File

@ -2,7 +2,9 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart'; import 'package:circle_app/app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart';
import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart';
@ -16,7 +18,6 @@ import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
class TIMConversationItem extends TIMUIKitStatelessWidget { class TIMConversationItem extends TIMUIKitStatelessWidget {
final String faceUrl; final String faceUrl;
final String nickName; final String nickName;
@ -31,6 +32,8 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
final V2TimUserStatus? onlineStatus; final V2TimUserStatus? onlineStatus;
final int? convType; final int? convType;
final bool isCurrent; final bool isCurrent;
final bool isSameCity;
final V2TimUserFullInfo? userInfo;
/// Control if shows the identifier that the conversation has a draft text, inputted in previous. /// Control if shows the identifier that the conversation has a draft text, inputted in previous.
/// Also, you'd better specifying the `draftText` field for `TIMUIKitChat`, from the `draftText` in `V2TimConversation`, /// Also, you'd better specifying the `draftText` field for `TIMUIKitChat`, from the `draftText` in `V2TimConversation`,
@ -41,8 +44,10 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
Key? key, Key? key,
required this.isShowDraft, required this.isShowDraft,
required this.faceUrl, required this.faceUrl,
required this.isSameCity,
required this.nickName, required this.nickName,
required this.lastMsg, required this.lastMsg,
required this.userInfo,
this.onlineStatus, this.onlineStatus,
required this.isPined, required this.isPined,
this.isCurrent = false, this.isCurrent = false,
@ -56,7 +61,8 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
}) : super(key: key); }) : super(key: key);
Widget _getShowMsgWidget(BuildContext context) { Widget _getShowMsgWidget(BuildContext context) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isShowDraft && draftText != null && draftText != "") { if (isShowDraft && draftText != null && draftText != "") {
return TIMUIKitDraftText( return TIMUIKitDraftText(
context: context, context: context,
@ -68,6 +74,28 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
lastMessageBuilder!(lastMsg, groupAtInfoList) != null) { lastMessageBuilder!(lastMsg, groupAtInfoList) != null) {
return lastMessageBuilder!(lastMsg, groupAtInfoList)!; return lastMessageBuilder!(lastMsg, groupAtInfoList)!;
} }
return Row(
children: [
isSameCity
? const Text('[同城]',
style: TextStyle(
color: Color(0xFF04FDFB),
fontSize: 14
))
: Container(),
Expanded(
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(top: 3.sp),
child: TIMLastMsg(
fontSize: isDesktopScreen ? 12 : 14,
groupAtInfoList: groupAtInfoList,
lastMsg: lastMsg,
context: context,
),
))
]);
return TIMLastMsg( return TIMLastMsg(
fontSize: isDesktopScreen ? 12 : 14, fontSize: isDesktopScreen ? 12 : 14,
groupAtInfoList: groupAtInfoList, groupAtInfoList: groupAtInfoList,
@ -109,14 +137,19 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
@override @override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final TUITheme theme = value.theme; final TUITheme theme = value.theme;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return Container( return Container(
padding: const EdgeInsets.only(top: 6, bottom: 6, left: 16, right: 16), padding: const EdgeInsets.only(top: 6, bottom: 6, left: 16, right: 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.transparent, // color: Colors.transparent,
// gl.startPoint = CGPointMake(0.48, 0.48);
// gl.endPoint = CGPointMake(0.52, 0.52);
), // Alignment(0.52, 0.52)
gradient: LinearGradient(
colors: isPined
? [Color(0xFF4B3E5E), Color(0xFF334141)]
: [Colors.transparent, Colors.transparent])),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
@ -131,9 +164,12 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
ClipOval( ClipOval(
child: CachedNetworkImage(imageUrl: faceUrl,fit: BoxFit.cover,width: isDesktopScreen ? 40 : 44, child: CachedNetworkImage(
height: isDesktopScreen ? 40 : 44,) imageUrl: faceUrl,
), fit: BoxFit.cover,
width: isDesktopScreen ? 40 : 44,
height: isDesktopScreen ? 40 : 44,
)),
if (unreadCount != 0) if (unreadCount != 0)
Positioned( Positioned(
top: isDisturb ? -2.5 : -4.5, top: isDisturb ? -2.5 : -4.5,
@ -144,7 +180,17 @@ class TIMConversationItem extends TIMUIKitStatelessWidget {
height: isDisturb ? 10 : 18, height: isDisturb ? 10 : 18,
unreadCount: isDisturb ? 0 : unreadCount), unreadCount: isDisturb ? 0 : unreadCount),
), ),
) ),
if (userInfo != null)
Positioned(
bottom: 0,
right: 0,
child: (userInfo!.role ?? 0) > 0
? Image.asset(
getMsgImage(getGenderContent(userInfo!.role!)),
height: 13.sp,
)
: Container())
], ],
), ),
), ),