From 9255edfe3821da6418132c247058303de532719b Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Thu, 6 Jul 2023 16:52:31 +0800 Subject: [PATCH] =?UTF-8?q?IM=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/ios/Runner/Info.plist | 4 ++ ..._uikit_chat_history_message_list_item.dart | 9 ++-- ..._uikit_history_message_list_container.dart | 4 +- .../tim_uikit_chat_text_elem.dart | 10 ++-- circle_app/lib/app/chat/view.dart | 35 ++++++++++--- circle_app/lib/app/home/logic.dart | 17 +++++++ circle_app/lib/app/msg/view.dart | 50 ++++++++++++++++--- circle_app/lib/app/userinfo/logic.dart | 15 +++--- circle_app/lib/app/userinfo/view.dart | 6 ++- circle_app/lib/main.dart | 43 ++++++++++++---- circle_app/lib/network/api.dart | 4 +- 11 files changed, 150 insertions(+), 47 deletions(-) diff --git a/circle_app/ios/Runner/Info.plist b/circle_app/ios/Runner/Info.plist index 1a0eee6..79c92d1 100644 --- a/circle_app/ios/Runner/Info.plist +++ b/circle_app/ios/Runner/Info.plist @@ -2,6 +2,10 @@ + NSLocationWhenInUseUsageDescription + 应用想要访问您的位置,用于设置个人资料 + NSLocationAlwaysUsageDescription + 应用想要访问您的位置,用于设置个人资料 NSMicrophoneUsageDescription 应用想要访问您的麦克风,用于发送语音 NSCameraUsageDescription diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart index 8778273..7911022 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:math'; +import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; @@ -175,7 +176,7 @@ class TIMToolTipsConfig { this.additionalItemBuilder}); } -class TIMUIKitHistoryMessageListItem extends StatefulWidget { +class TIMHistoryMessageListItem extends StatefulWidget { /// message instance final V2TimMessage message; @@ -261,7 +262,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { final List customEmojiStickerList; - const TIMUIKitHistoryMessageListItem( + const TIMHistoryMessageListItem( {Key? key, required this.message, @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") @@ -332,7 +333,7 @@ class TipsActionItem extends TIMUIKitStatelessWidget { } class _TIMUIKItHistoryMessageListItemState - extends TIMUIKitState + extends TIMUIKitState with TickerProviderStateMixin { SuperTooltip? tooltip; @@ -459,7 +460,7 @@ class _TIMUIKItHistoryMessageListItemState clearJump, )!; } - return TIMUIKitTextElem( + return TIMTextElem( chatModel: model, message: messageItem, isFromSelf: messageItem.isSelf ?? true, diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart index 6ed275f..824242a 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart @@ -17,6 +17,8 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageLi import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'tim_uikit_chat_history_message_list_item.dart'; + enum LoadingPlace { none, top, @@ -154,7 +156,7 @@ class _TIMUIKitHistoryMessageListContainerState groupAtInfoList: widget.groupAtInfoList, mainHistoryListConfig: widget.mainHistoryListConfig, itemBuilder: (context, message) { - return TIMUIKitHistoryMessageListItem( + return TIMHistoryMessageListItem( textFieldController: widget.textFieldController, userAvatarBuilder: widget.userAvatarBuilder, customEmojiStickerList: widget.customEmojiStickerList, diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart index e1bed03..b7ca502 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart @@ -13,7 +13,7 @@ import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/link_preview_en import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; -class TIMUIKitTextElem extends StatefulWidget { +class TIMTextElem extends StatefulWidget { final V2TimMessage message; final bool isFromSelf; final bool isShowJump; @@ -27,7 +27,7 @@ class TIMUIKitTextElem extends StatefulWidget { final bool isUseDefaultEmoji; final List customEmojiStickerList; - const TIMUIKitTextElem( + const TIMTextElem( {Key? key, required this.message, required this.isFromSelf, @@ -44,10 +44,10 @@ class TIMUIKitTextElem extends StatefulWidget { : super(key: key); @override - State createState() => _TIMUIKitTextElemState(); + State createState() => _TIMTextElemState(); } -class _TIMUIKitTextElemState extends TIMUIKitState { +class _TIMTextElemState extends TIMUIKitState { bool isShowJumpState = false; bool isShining = false; @@ -59,7 +59,7 @@ class _TIMUIKitTextElemState extends TIMUIKitState { } @override - void didUpdateWidget(TIMUIKitTextElem oldWidget) { + void didUpdateWidget(TIMTextElem oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.message.msgID == null && widget.message.msgID != null) { _getLinkPreview(); diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index 6a6f205..dc6aa15 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -1,5 +1,7 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/tim_uikit_chat.dart'; import 'package:circle_app/components/my_app_bar.dart'; +import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -60,12 +62,7 @@ class ChatPage extends StatelessWidget { @override Widget build(BuildContext context) { return TIMChat( - conversation: logic.selectedConversation ?? - V2TimConversation( - conversationID: "c2c_10040818", - userID: "10040818", - showName: "Test Chat", - type: 1), + conversation: logic.selectedConversation!, customStickerPanel: renderCustomStickerPanel, config: const TIMUIKitChatConfig( // 仅供演示,非全部配置项,实际使用中,可只传和默认项不同的参数,无需传入所有开关 @@ -83,12 +80,36 @@ class ChatPage extends StatelessWidget { ], ), customAppBar: MyAppBar( - centerTitle: '1111', + centerTitle: logic.selectedConversation!.showName!, actionWdiget: GestureDetector( child: Text('TA的主页',style: TextStyle(color: Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),), ), onPressed: () {}, ), + userAvatarBuilder: (BuildContext context, V2TimMessage message) { + return avatarWidget(message.faceUrl ?? 'http://qiniuyun.ikuayou.com/avatar/default/default_header.png'); + }, ); } + + avatarWidget(String url, {double width = 34}) { + return GestureDetector( + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + url.contains("http") ? ClipOval( + child: CachedNetworkImage( + imageUrl:url, + width: (width - 2).sp, + height: (width - 2).sp, + fit: BoxFit.cover, + ), + ) : Text(url,style: TextStyle(color: Color(0xffF756FF),fontSize: 12.sp),) + ], + )); + } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index 62dc663..af525fa 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -1,5 +1,8 @@ import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/minefragment/logic.dart'; +import 'package:circle_app/main.dart'; +import 'package:circle_app/network/api.dart'; +import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,12 +27,26 @@ class HomeLogic extends GetxController { @override void onInit() { super.onInit(); + getIMData(); + tabs.add(MsgPage()); tabs.add(CirclePage()); tabs.add(MinefragmentPage()); } + void getIMData() async { + // _coreInstance.; + if (!coreInstance.isLoginSuccess) { + var data = await DioManager.instance + .get(url: Api.getIMInfo); + if (data['code'] == 200) { + loginIM(data['data']['account_id'].toString(), data['data']['user_sig']); + } + } + + } + String getInfo () { return getBaseImage('image'); diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index 04e1320..6342407 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -1,3 +1,4 @@ +import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; @@ -30,9 +31,9 @@ class MsgPage extends StatelessWidget { return Column( children: [ navigatorItem(), - tipWidget(), - reconmandWidget(), - Text(controller.state.msg), + // tipWidget(), + // reconmandWidget(), + // Text(controller.state.msg), Expanded(child: msgWdiget(context)) ], ); @@ -42,6 +43,11 @@ class MsgPage extends StatelessWidget { } navigatorItem() { + var logic = Get.find(); + String count = '0'; + if (logic != null) { + count = (logic.statistics?['like_me_count'] ?? 0).toString(); + } return Container( width: Get.width, padding: EdgeInsets.only(left: 18.sp, right: 18.sp), @@ -52,11 +58,39 @@ class MsgPage extends StatelessWidget { Positioned( left: 0, child: GestureDetector( - child: Image.asset( - getMsgImage('msg_love'), - width: 30.sp, - ), - )), + onTap: () { + Get.toNamed(AppRoutes.FriendsActivity,arguments: '1'); + }, + child: Stack( + children: [ + Container(width: count .length > 2 ? 45.sp : count .length > 1 ? 38.sp : 35.sp,height: 30.sp,), + Image.asset( + getMsgImage('msg_love'), + width: 30.sp, + ), + + int.parse(count) > 0 ? Positioned( + right:0, + child: Container( + padding: EdgeInsets.only(left: 5.sp,right: 5.sp), + height: 14.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient:const LinearGradient(colors: [ + Color(0xFFC343F9), + Color(0xFFFB34B2), + ], + ) + + ), + alignment: Alignment.center, + child: Text( + int.parse(count) > 99 ? '99+' : count, + style: TextStyle(color: Colors.white,fontSize: 10.sp,fontWeight: FontWeight.w500), + ), + )) : Container(), + ], + ))), ShaderMask( shaderCallback: (Rect bounds) { return const LinearGradient( diff --git a/circle_app/lib/app/userinfo/logic.dart b/circle_app/lib/app/userinfo/logic.dart index 5b95844..6d89bed 100644 --- a/circle_app/lib/app/userinfo/logic.dart +++ b/circle_app/lib/app/userinfo/logic.dart @@ -17,6 +17,7 @@ class UserinfoLogic extends GetxController { final UserinfoState state = UserinfoState(); final ImagePicker _picker = ImagePicker(); UserBean? userInfoBean = null; + String imId = ''; String ageMsg = ""; var isVip = 0; var onLineCity = ""; @@ -45,15 +46,14 @@ class UserinfoLogic extends GetxController { } state.imaglist.clear(); if (userId == '') { - isMe = true; var data = await DioManager.instance.get(url: Api.getUserInfo); var bean = BaseResponse.fromJson( data, (data) => ResponseBean.fromJson(data)); if (bean.isSuccess()) { - isLikeFoMsg = "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; + userInfoBean = bean.data.user; isVip = userInfoBean!.vip; //访问自己强制在线 @@ -79,8 +79,6 @@ class UserinfoLogic extends GetxController { state.imaglist.add(element); }); } - - } else { isMe = false; var data = await DioManager.instance @@ -93,7 +91,7 @@ class UserinfoLogic extends GetxController { "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; userInfoBean = bean.data!.user; isVip = userInfoBean!.vip; - + imId = bean.data.account_id; onLineCity = userInfoBean!.isOnline == true ? "在线" : "离线"; if (userInfoBean!.city != null) { onLineCity = "$onLineCity·${userInfoBean!.city}"; @@ -126,8 +124,6 @@ class UserinfoLogic extends GetxController { } update(); - - var data = await DioManager.instance.get(url: Api.getqiniuToken, params: {}); var bean = BaseResponse.fromJson( @@ -154,7 +150,7 @@ class UserinfoLogic extends GetxController { var bean = BaseResponse.fromJson(data, (data) => data); if (bean.code == 200) { state.imaglist.removeAt(index); - // Navigator.pop(Get.context!); + // Navigator.pop(Get.context!); update(); } } @@ -305,15 +301,18 @@ class ResponseBean { int likeMeCount; int imageUrgeCount; bool is_follow; + String account_id; ResponseBean( {required this.user, required this.likeMeCount, required this.imageUrgeCount, + required this.account_id, required this.is_follow}); factory ResponseBean.fromJson(Map json) { return ResponseBean( + account_id: json['account_id'], user: UserBean.fromJson(json['user']), likeMeCount: json['like_me_count'], imageUrgeCount: json['image_urge_count'], diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index feeb43c..8b7d9f6 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -1,6 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/userinfo/widgets/home_call_out.dart'; +import 'package:circle_app/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -137,7 +138,10 @@ class _MyTabbedScreenState extends State ), GestureDetector( onTap: () { - showToast("私聊"); + if (logic.userInfoBean != null) { + pushChatPage(logic.imId, logic.userInfoBean!.nickname); + } + }, child: Container( width: 130.sp, diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 5f0e689..3ad5afc 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -13,10 +13,35 @@ import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'app/splash/view.dart'; +final CoreServicesImpl coreInstance = TIMUIKitCore.getInstance(); + void main() { runApp(const MyApp()); } + +//登录IM +loginIM(String userId,String sig) async { + var info = await coreInstance.login( + userID: userId, + userSig:sig,); +} + +//退出IM +logoutIM() async { + await coreInstance.logout(); +} + +//跳转发消息页面 +pushChatPage(String imId,String userName) { + var con = V2TimConversation( + conversationID: "c2c_$imId", + userID: imId, + showName: userName, + type: 1); + Get.toNamed(AppRoutes.Chat,arguments: con); +} + class MyApp extends StatefulWidget { const MyApp({super.key}); @@ -24,12 +49,14 @@ class MyApp extends StatefulWidget { State createState() => _MyAppState(); } + + class _MyAppState extends State { // This widget is the root of your application. final List _guideList = ['bg', 'home_back']; - final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); + @override void initState() { initIM(); @@ -38,9 +65,9 @@ class _MyAppState extends State { } initIM() { - _coreInstance.init( + coreInstance.init( sdkAppID: - 1400793496, // Replace 0 with the SDKAppID of your IM application when integrating + 1400799631, // Replace 0 with the SDKAppID of your IM application when integrating // language: LanguageEnum.en, // 界面语言配置,若不配置,则跟随系统语言 loglevel: LogLevelEnum.V2TIM_LOG_DEBUG, onTUIKitCallbackListener: (TIMCallback callbackValue) { @@ -73,7 +100,8 @@ class _MyAppState extends State { } }, // [建议配置,详见此部分](https://cloud.tencent.com/document/product/269/70746#callback) listener: V2TimSDKListener(onConnectSuccess: () { - loginIM(); + print('IM登录成功'); + // loginIM(); })); } @@ -86,13 +114,6 @@ class _MyAppState extends State { return AssetImage(getBaseImage(image)); } - loginIM() async { - var info = await _coreInstance.login( - userID: '123456', - userSig: - 'eJwtzEELgjAYxvHvsmshc25rCl40OlRIYaVX0RUvrTFsDFn03TP1*Pwe*H-Q5VgGTvYoQSTAaD1t6KS2cIeJQxJRxpfn3T0bY6BDSUgx3sQRjfn8yMFAL0dnjBGM8awWXn-jggtBY0qXCjzGcJ7tT4eVrHa6aG9FWfsms*rqK3cW2hulHKkHtzU2L9sUfX-YTTG5'); - print(info); - } @override Widget build(BuildContext context) { diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index 5514f1a..628dfad 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -165,8 +165,8 @@ class Api { - - + //获取IM配置信息 + static const getIMInfo = 'msg-service/im/token'; //发现页统计 static const getInterestsCount = 'user-service/my/statistics';