From 6629751835f5c2363d92e7c3ecf676cbf38b7d5a Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 26 Jul 2023 14:21:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BD=AE=E9=A1=B6=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=90=8C=E5=9F=8E=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=92=8C=E7=94=A8=E6=88=B7=E6=80=A7=E5=88=AB=E6=A0=87?= =?UTF-8?q?=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/assets/images/msg/CD.png | Bin 0 -> 1586 bytes circle_app/assets/images/msg/FTM.png | Bin 0 -> 977 bytes circle_app/assets/images/msg/MTF.png | Bin 0 -> 1075 bytes circle_app/assets/images/msg/女.png | Bin 0 -> 2768 bytes circle_app/assets/images/msg/男.png | Bin 0 -> 1094 bytes circle_app/assets/images/msg/酷儿.png | Bin 0 -> 4022 bytes .../tim_uikit_conversation.dart | 256 +++++++++++------- .../tim_uikit_conversation_item.dart | 68 ++++- 8 files changed, 221 insertions(+), 103 deletions(-) create mode 100644 circle_app/assets/images/msg/CD.png create mode 100644 circle_app/assets/images/msg/FTM.png create mode 100644 circle_app/assets/images/msg/MTF.png create mode 100644 circle_app/assets/images/msg/女.png create mode 100644 circle_app/assets/images/msg/男.png create mode 100644 circle_app/assets/images/msg/酷儿.png diff --git a/circle_app/assets/images/msg/CD.png b/circle_app/assets/images/msg/CD.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc86efa5bd58f33e3e45f9ba8e05c25d04b39bb GIT binary patch literal 1586 zcmV-22F>}2P)!C1#Abw7Wx9`DF7UPwdkbUy z_-{1`Ys_y4U&QTU!aSfB#)0h6ArYFaCL5^Km^Vq8eT_qoV~>-jAn9%-0#_1T^CH(? zNw%!Utw|ZlA~!B~iSOEJDD4X(&|l8~ZAjdHC#`@=bRQ97sqoAb91_S~sF79*#feRB+|SlEE+JE0Dx$z3=F-4q0!ZdKUlurK1NR){ zb)bBo8)^MlmT7Ob@gG9=9~O2@-MNU%UN@y}(HDU- z;&Ur25K2kd!Rli?!T|F{+?k)jXrL2Dz#!U1!x2#!z)y4f>vuN#ldof1ao+|}(N4>} zCWfr)W86#M*vLS!#(95Vb&a+& z!dGx8Ap5sNbY|zR$c+FDK_#Q=%O@AHE!a*T=a;ypIZbraK^TSQ6fYv!VYD+Sto@}H z0^DSD4OhwLRT^?}RD0WQCP>{;tufkERggec%+5LlD_d%XG0>Lc^l?~%0dzPCDVWPm ze_37ryRQY-7D)1+z@6NP)Hrsfc6zn}7kFJSA~BptWV@ zl0c%u=SeIp8Q=g(>R>+C)Ld+{ogiaZh^nc7fJ>hWEL_(lpFSzk&;WywQ_55)cRu~) zVriPaPe@F>&(XPr=MLiRlU}Fp*0}k&deh<# zKd~gSctdaulBe7Oo9gKz9v(0o7|2;nsC}1(>^5C^d0b_E?A!4`e!9Yv3(Iofhe%rQ zd5I%!-u|&S1^#dd)BT0>^0MTBq?rkC&$HZR7~9}$WDxAM)N$~t%*0@*{C9?@S0}o1 znE6EDm&=8P7fB3qk!@#a+K)=q9VzXvgM(XxT>g)JZAQ;l_HVmiqUi*TgKz#3Im>^_ zLcw_)hLNE!TITs&nj7#8uLhpI)p46;8P<@U1V7u5s`#&KJGE|K6rHyNRkS%Ig83b= zD*=|nsG$n7LxsC_;&c&0j-ZAzkR$Hjlz1``6=CgKU9|*N>#C}O0{!||J2facr1iT= z)6X{mHBS{_Yrh>Sk`^y*D}((`UM12L${s7J4$7|gXTXpnj!%o1lkl}oU6iRV8^O_i zpnWlwmKA>HPzjsb-#Zn5RlGJ*hy5QB^GjF(TRIp~{x8UStW#QyIt8Byb^-LktvZ9u kO{kNhEP`XVMod5W7n39{<($RE&Hw-a07*qoM6N<$f&@qHb^rhX literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/FTM.png b/circle_app/assets/images/msg/FTM.png new file mode 100644 index 0000000000000000000000000000000000000000..b54f34d5706e35f8b641c363c293e33360cf4ad8 GIT binary patch literal 977 zcmV;?11|iDP)001Wl1^@s6M|ic%00009a7bBm001F4 z001F40Y#QEU;qFB0drDELIAGL9O(c600d`2O+f$vv5yPXlTA_PVPc$@$u2%+GK@TuI^ zI-Y1;(`JnN)0YAd6CwJp4V=U}Fp;t-E%25sZM3PPEImr@Cbj-VLJe`4LNSrh_`%P~ z&s$cp*s`?dldwn;jt91~^P+f`FV=AiWhoSFU9964%91PCs#xT+?7ui}p)4%eD-vvM zcdP_>`iFbG2n|eR^jNU4tQT6JKFzIaBOOy*8GF{xwjF1#Y4^EOrLA$tWM!wA>fcnf zOLjb?7xdeU9g$o*otCw-@=oFK*& z%VXYX^Pg!8J!ovjJIw>Fa@gz#I^Pw4nLxnDKNPghQ2whZj~j~0 z>i};yd(H&&Uha)pT3VV*oZ2HylV6t^T$ES70Rk~+r!+d%v|+>46Z zsK^c7%%76uKH0Jl36|FNF_T8vz^bnS= zE~Fuyeo7%X4(;|Dwywl%+a7Qb-l{N_NaQ4Jhw)#y%>?p0?1Ygt)20b(OoHVDDD326 z20R}>?>lI|#w=1a9b!GhGgLBkp|t1>KCcW6?cTyaOS zv7TtwBlQhLvu;>S`MMz=m@WOFzC)lu*cIuO(M|KM!#W<{I#`;oXx1qHK8qT#&mK$A z=U{GPlq#y@w*Em&`y|>o9Hx~ev$QF@M4y9%3)FpbVrFuV+K(j-EYdkW*SU*O%yuhl zyf90Hd^tsIR)-?&|JTZ6o{pN%XIc8$p3a4T@9Pyz4)s{N00000NkvXXu0mjfV!q05 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/MTF.png b/circle_app/assets/images/msg/MTF.png new file mode 100644 index 0000000000000000000000000000000000000000..60016f4222ac876459eb73330d6ab1ceef52ba1d GIT binary patch literal 1075 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 M07*qoM6N<$f*k1XvH$=8 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/酷儿.png b/circle_app/assets/images/msg/酷儿.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4bcfb06fab6d82dce620dfd06a2ff54e6a99fd GIT binary patch literal 4022 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 literal 0 HcmV?d00001 diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index cb31a2e..1c99535 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -307,6 +308,36 @@ class _TIMConversationState extends TIMUIKitState { return widget.itemSlideBuilder ?? _defaultSlideBuilder; } + Future> getUserListInfo(List userIdList) async { + + V2TimValueCallback getLoginUserRes = + await TencentImSDKPlugin.v2TIMManager.getLoginUser(); + if (getLoginUserRes.code == 0) { + //获取成功 + userIdList.insert(0, getLoginUserRes.data!);// getLoginUserRes.data为查询到的登录用户的UserID + } + //获取用户资料 + V2TimValueCallback> 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 void dispose() { super.dispose(); @@ -337,111 +368,152 @@ class _TIMConversationState extends TIMUIKitState { _model.clearScrollToConversation(); } + + List userIdList = []; + + + filteredConversationList.forEach((element) { + userIdList.add(element!.userID!); + }); + + Widget conversationList() { return filteredConversationList.isNotEmpty - ? ListView.builder( - controller: _autoScrollController, - shrinkWrap: true, - itemCount: filteredConversationList.length, - itemBuilder: (context, index) { - if (index == filteredConversationList.length - 1) { - if (haveMoreData) { - _timuiKitConversationController.loadData(); + ? FutureBuilder>( + future: getUserListInfo(userIdList), + builder: (BuildContext context, AsyncSnapshot> snapshot) { + return ListView.builder( + controller: _autoScrollController, + shrinkWrap: true, + itemCount: filteredConversationList.length, + 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 == - model.selectedConversation?.conversationID; + Widget conversationLineItem() { - 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 Material( - color: Colors.transparent, - child: InkWell( - child: TIMConversationItem( - isCurrent: isCurrent, - 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), + return TUIKitScreenUtils.getDeviceWidget( + desktopWidget: AutoScrollTag( + key: ValueKey(conversationItem.conversationID), + controller: _autoScrollController, + 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(), ), - ); - } - - return TUIKitScreenUtils.getDeviceWidget( - desktopWidget: AutoScrollTag( - key: ValueKey(conversationItem.conversationID), - controller: _autoScrollController, - 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)); - }, + ), + defaultWidget: AutoScrollTag( + key: ValueKey(conversationItem.conversationID), + controller: _autoScrollController, + index: index, + child: Slidable( + groupTag: 'conversation-list', child: conversationLineItem(), - ), - ), - defaultWidget: AutoScrollTag( - key: ValueKey(conversationItem.conversationID), - controller: _autoScrollController, - index: index, - child: Slidable( - groupTag: 'conversation-list', - child: conversationLineItem(), - endActionPane: ActionPane( - extentRatio: - slideChildren.length > 2 ? 0.77 : 0.5, - motion: const DrawerMotion(), - children: slideChildren)), - )); - }) + endActionPane: ActionPane( + extentRatio: + slideChildren.length > 2 ? 0.77 : 0.5, + motion: const DrawerMotion(), + children: slideChildren)), + )); + }); + }) : (widget.emptyBuilder != null ? widget.emptyBuilder!() : Container()); diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart index 65e0d3f..1aa93a6 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart @@ -2,7 +2,9 @@ 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/util/util.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/views/TIMUIKitConversation/tim_uikit_conversation_item.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/base_widgets/tim_ui_kit_base.dart'; - class TIMConversationItem extends TIMUIKitStatelessWidget { final String faceUrl; final String nickName; @@ -31,6 +32,8 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { final V2TimUserStatus? onlineStatus; final int? convType; final bool isCurrent; + final bool isSameCity; + final V2TimUserFullInfo? userInfo; /// 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`, @@ -41,8 +44,10 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { Key? key, required this.isShowDraft, required this.faceUrl, + required this.isSameCity, required this.nickName, required this.lastMsg, + required this.userInfo, this.onlineStatus, required this.isPined, this.isCurrent = false, @@ -56,7 +61,8 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { }) : super(key: key); Widget _getShowMsgWidget(BuildContext context) { - final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final isDesktopScreen = + TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; if (isShowDraft && draftText != null && draftText != "") { return TIMUIKitDraftText( context: context, @@ -68,6 +74,28 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { lastMessageBuilder!(lastMsg, groupAtInfoList) != null) { 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( fontSize: isDesktopScreen ? 12 : 14, groupAtInfoList: groupAtInfoList, @@ -109,14 +137,19 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final TUITheme theme = value.theme; - final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final isDesktopScreen = + TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; return Container( padding: const EdgeInsets.only(top: 6, bottom: 6, left: 16, right: 16), 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( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -131,9 +164,12 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { clipBehavior: Clip.none, children: [ ClipOval( - child: CachedNetworkImage(imageUrl: faceUrl,fit: BoxFit.cover,width: isDesktopScreen ? 40 : 44, - height: isDesktopScreen ? 40 : 44,) - ), + child: CachedNetworkImage( + imageUrl: faceUrl, + fit: BoxFit.cover, + width: isDesktopScreen ? 40 : 44, + height: isDesktopScreen ? 40 : 44, + )), if (unreadCount != 0) Positioned( top: isDisturb ? -2.5 : -4.5, @@ -144,7 +180,17 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { height: isDisturb ? 10 : 18, 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()) ], ), ),