From bf8868440059c368e15180e3d493b55a4f9793fb Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 28 Feb 2024 14:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E6=A0=87?= =?UTF-8?q?=E8=AF=86=EF=BC=8C=E5=8F=91=E7=8E=B0=E9=A1=B5=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=B2=BE=E9=80=89=EF=BC=8C=E6=B6=88=E6=81=AF=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2UI=E8=B0=83=E6=95=B4=EF=BC=8C=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E4=BA=AB=EF=BC=8C=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BA=95=E9=83=A8=E9=82=80=E8=AF=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/app/src/main/AndroidManifest.xml | 1 - .../kotlin/com/leyuan/app/MainActivity.kt | 2 + circle_app/android/gradle.properties | 1 + circle_app/assets/images/circle/QA_icon.png | Bin 0 -> 5403 bytes circle_app/assets/images/mine/im_first.png | Bin 0 -> 11318 bytes circle_app/assets/images/mine/im_neglect.png | Bin 0 -> 22293 bytes .../assets/images/mine/im_right_look.png | Bin 0 -> 11866 bytes circle_app/assets/images/mine/im_visit.png | Bin 0 -> 11706 bytes .../assets/images/msg/msg_add_black.png | Bin 0 -> 18950 bytes circle_app/assets/images/msg/msg_more.png | Bin 0 -> 653 bytes circle_app/assets/images/msg/msg_report.png | Bin 0 -> 14050 bytes circle_app/assets/images/msg/msg_share.png | Bin 0 -> 16841 bytes .../assets/images/tabbar/call_normal.png | Bin 0 -> 11203 bytes .../assets/images/tabbar/call_selected.png | Bin 0 -> 20061 bytes .../ios/Runner.xcodeproj/project.pbxproj | 6 +- .../tim_uikit_text_field.dart | 43 +- .../app/chat/TIMUIKitChat/tim_uikit_chat.dart | 328 +++++++--- circle_app/lib/app/chat/view.dart | 134 +++- .../lib/app/chat/widget/more_dialog.dart | 475 ++++++++++++++ circle_app/lib/app/circle/logic.dart | 5 +- circle_app/lib/app/circle/state.dart | 3 + circle_app/lib/app/circle/view.dart | 19 +- .../lib/app/circle/widgets/discover.dart | 2 +- .../app/circle/widgets/info_list_view.dart | 15 +- .../lib/app/circle/widgets/like_view.dart | 30 +- .../lib/app/circle/widgets/vicinity.dart | 9 +- circle_app/lib/app/circle_list/logic.dart | 1 + circle_app/lib/app/dialog/UpdateDialog.dart | 14 +- circle_app/lib/app/home/logic.dart | 34 +- circle_app/lib/app/home/view.dart | 75 ++- circle_app/lib/app/login/login/logic.dart | 11 + .../tim_uikit_conversation.dart | 16 +- .../tim_uikit_conversation_item.dart | 11 +- .../app/msg/recommend_circle_friend_item.dart | 588 ++++++++++++++++++ circle_app/lib/app/quick/view.dart | 8 +- circle_app/lib/app/swiper/view.dart | 344 ++++++---- circle_app/lib/app/userinfo/logic.dart | 3 + circle_app/lib/app/userinfo/view.dart | 36 +- circle_app/lib/common/Widgets/tag_widget.dart | 41 ++ circle_app/lib/common/Widgets/user_share.dart | 481 ++++++++++++++ circle_app/lib/main.dart | 13 + circle_app/lib/network/api.dart | 2 +- circle_app/lib/network/dio_manager.dart | 4 +- .../lib/util/SharedPreferencesHelper.dart | 2 +- circle_app/lib/util/util.dart | 20 +- circle_app/pubspec.lock | 8 - circle_app/pubspec.yaml | 2 +- 47 files changed, 2455 insertions(+), 332 deletions(-) create mode 100644 circle_app/assets/images/circle/QA_icon.png create mode 100644 circle_app/assets/images/mine/im_first.png create mode 100644 circle_app/assets/images/mine/im_neglect.png create mode 100644 circle_app/assets/images/mine/im_right_look.png create mode 100644 circle_app/assets/images/mine/im_visit.png create mode 100644 circle_app/assets/images/msg/msg_add_black.png create mode 100644 circle_app/assets/images/msg/msg_more.png create mode 100644 circle_app/assets/images/msg/msg_report.png create mode 100644 circle_app/assets/images/msg/msg_share.png create mode 100644 circle_app/assets/images/tabbar/call_normal.png create mode 100644 circle_app/assets/images/tabbar/call_selected.png create mode 100644 circle_app/lib/app/chat/widget/more_dialog.dart create mode 100644 circle_app/lib/app/msg/recommend_circle_friend_item.dart create mode 100644 circle_app/lib/common/Widgets/tag_widget.dart create mode 100644 circle_app/lib/common/Widgets/user_share.dart diff --git a/circle_app/android/app/src/main/AndroidManifest.xml b/circle_app/android/app/src/main/AndroidManifest.xml index 838bce2..625e234 100644 --- a/circle_app/android/app/src/main/AndroidManifest.xml +++ b/circle_app/android/app/src/main/AndroidManifest.xml @@ -63,7 +63,6 @@ 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 FV1lPlQ8WMm literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/im_first.png b/circle_app/assets/images/mine/im_first.png new file mode 100644 index 0000000000000000000000000000000000000000..56754e4229b40c652a73b350b3ad6e40c76d7cfe GIT binary patch literal 11318 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 D7Pmjf literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/im_right_look.png b/circle_app/assets/images/mine/im_right_look.png new file mode 100644 index 0000000000000000000000000000000000000000..8606c42d0ec130fd2d0d0376dd138b88a301960b GIT binary patch literal 11866 zcmX|nby$>N&^9b9tmH1;EL}=>Nq2XbbcZwuEG><6H_Fo8Qi8NdN=XO{64H&n>+gNP z?~lFqx}H5dXXea2b7t;);xyG2a4^X+QBY8DloVyPQBY7p|2`me
%r@zQARBvqs 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/im_visit.png b/circle_app/assets/images/mine/im_visit.png new file mode 100644 index 0000000000000000000000000000000000000000..13d1b12f2d6009ab61a231b31f9ce0bbb42db060 GIT binary patch literal 11706 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

* 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/msg_more.png b/circle_app/assets/images/msg/msg_more.png new file mode 100644 index 0000000000000000000000000000000000000000..63b1e73a8e3141ceb9df1268a35100d215057613 GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>U~>0#aSW-5 zdpm1?mS~_r`~LY0GO|~5Ha4_!gx!j~*`;8%uTekYG4l*JmknDkv0rdHa_ZE%Tj~O? zuF7nJEdLFjHS{hhe17Ka*?AwVzuuX9vp>K6?oQ>JG8Ki-H)l35{yi?hY_uRsc%!4) z3AU>oHx@|Qe^-!BY0hHF3Fw_)J%KlBlcQjvOa;fBl}qDZt-sF@u4;QO&DTCj@S}{y zY+sY+A8aqTEII3=YulhSIU#Lh_N2J9tXGU*q%5X+8cn{@f56l8z46yC3|9PiSg$pF zd2f7FS7Y1NAACDl?@aq*Tzq$(bWg|P0~37~+4lWq%klg*Z|!340JD=PKC(R#KRRna z&`~!RNHI!>Jbo^h(hPJ`1MjMj#r#oQfR5tW!7+!yZ3eF?=dF&%olDG2yyt?1d3Ve_ zWz_#*`2khWc%!FZ7^Du)syB?7c!jNQvOoUxdw&K`%Td*q|?;5=L{>%G!hU~*FW}ldEoO#E#b+-5S1sxXK_u7>5N65a&uFI}& zD`noHyz=0znkt6941T`n4CWs&`xG(#i&=0G|AL9`>%1c$)v#?jp0nlhwffsa&)a<- z+On->;Ae|g`OgzG?aIHK9&=3=T)Fz)aRcMqW7QYz1d>1L-cXP>iJZ2d?G{SRA-V1< b&o5Siifm75k?Grk>5IYB)z4*}Q$iB}UYsI= literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/msg_report.png b/circle_app/assets/images/msg/msg_report.png new file mode 100644 index 0000000000000000000000000000000000000000..89e94365016b71f0c596f1534ea9883cb875a624 GIT binary patch literal 14050 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/msg_share.png b/circle_app/assets/images/msg/msg_share.png new file mode 100644 index 0000000000000000000000000000000000000000..5c549f4772b3b5189402d52ab17a2e6825f6e556 GIT binary patch literal 16841 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 m3fn`-cXbI>wkY8H>;D7&DaIHCYnC?v0000n}$D literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/tabbar/call_normal.png b/circle_app/assets/images/tabbar/call_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a4a0d588fb7a69745296748ed0f406d37ebf55 GIT binary patch literal 11203 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 { int latestSendEditStatusTime = DateTime.now().millisecondsSinceEpoch; + UserBean? userInfoBean; + setCurrentCursor(int? value) { currentCursor = value; } @@ -267,6 +271,33 @@ class _InputTextFieldState extends TIMUIKitState { } Future checkImStatus() async { + + List< + String> pressionStr = '微信、QQ、加Q、+V、地球号、绿泡泡、公众号、网站、app、视频、手机号、id、企鹅、门槛、收费、加群' + .split('、'); + + if (textEditingController.text.isNotEmpty && (userInfoBean?.wx_num?.isEmpty ?? true)) { + bool isContain = false; + String sendText = textEditingController.text.toUpperCase(); + for (String text in pressionStr) { + if (sendText.contains(text)) { + isContain = true; + } + } + if (isContain) { + await showAddWxPicker( + userInfoBean!.wx_num!.isNotEmpty ?? false, + isHidden: + userInfoBean!.wx_num!.isNotEmpty ?? false, + isWxHidden: userInfoBean!.hide_wx_num == 1, + ); + imStatusOK = false; + return imStatusOK; + } + + } + + var data = await DioManager.instance.get(url: Api.imstate); @@ -880,7 +911,7 @@ class _InputTextFieldState extends TIMUIKitState { @override void initState() { super.initState(); - + loadMyInfoData(); checkHintText(); if (PlatformUtils().isWeb || PlatformUtils().isDesktop) { focusNode = FocusNode( @@ -1277,4 +1308,14 @@ class _InputTextFieldState extends TIMUIKitState { } } } + + void loadMyInfoData() async { + var data = await DioManager.instance.get(url: Api.getUserInfo); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + + if (bean.isSuccess()) { + userInfoBean = bean.data.user; + } + } } diff --git a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart index 81b767d..468e08b 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart @@ -1,10 +1,13 @@ // ignore_for_file: must_be_immutable, avoid_print +import 'package:circle_app/app/chat/widget/more_dialog.dart'; import 'package:circle_app/components/func_widget.dart'; +import 'package:circle_app/util/eventBus.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; @@ -23,6 +26,11 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageLi import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/at_member_panel.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_send_file.dart'; +import '../../../common/colors/app_color.dart'; +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../../router/app_routers.dart'; +import '../../userinfo/logic.dart'; import 'TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; import 'TIMUIKItMessageList/tim_uikit_history_message_list_container.dart'; @@ -193,7 +201,8 @@ class _TUIChatState extends TIMUIKitState { final TUIChatGlobalModel chatGlobalModel = serviceLocator(); bool _dragging = false; - + bool isLike = false; + UserBean? otherUserBean; final GlobalKey alignKey = GlobalKey(); final GlobalKey listContainerKey = GlobalKey(); @@ -209,9 +218,14 @@ class _TUIChatState extends TIMUIKitState { axis: Axis.vertical, ); + var sub; + @override void initState() { super.initState(); + sub = EventBusManager.on().listen((event) { + model.clearHistory(); + }); if (kProfileMode) { Frame.init(); } @@ -224,18 +238,19 @@ class _TUIChatState extends TIMUIKitState { print("Page render time:$timeSpend ms"); } }); + // loadUserData(); } @override void dispose() { super.dispose(); + sub.cancel(); if (kProfileMode) { Frame.destroy(); } try { model.dispose(); } catch (e) {} - } @override @@ -314,13 +329,15 @@ class _TUIChatState extends TIMUIKitState { return widget.conversation.type == 1 ? ConvType.c2c : ConvType.group; } - String _getTotalUnReadCount(int unreadCount) { return unreadCount < 99 ? unreadCount.toString() : "99+"; } @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { + if (otherUserBean == null) { + loadUserData(); + } final TUITheme theme = value.theme; final closePanel = OptimizeUtils.throttle((_) => textFieldController.hideAllPanel(), 60); @@ -373,38 +390,51 @@ class _TUIChatState extends TIMUIKitState { } } - return BgWidget(widget:GestureDetector( + return BgWidget( + widget: GestureDetector( onTap: () { textFieldController.hideAllPanel(); }, child: Scaffold( - backgroundColor: Colors.transparent, + backgroundColor: Colors.transparent, // resizeToAvoidBottomInset: false, - appBar:PreferredSize( + appBar: PreferredSize( preferredSize: const Size.fromHeight(48.0), child: Stack( alignment: Alignment.centerLeft, children: [ widget.customAppBar!, - chatGlobalModel.totalUnReadCount > 0 ? Positioned(left: 40.sp,bottom: 12.sp,child: Container( - // width: 22, - height: 22, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(11), - color: theme.cautionColor, - ), - constraints: BoxConstraints( - maxWidth: 30, - minWidth: 22, - ), - child: - Text(_getTotalUnReadCount(chatGlobalModel.totalUnReadCount),style: TextStyle(color: Colors.white,fontSize: 12.sp),), - )) : Container() + chatGlobalModel.totalUnReadCount > 0 + ? Positioned( + left: 40.sp, + bottom: 12.sp, + child: Container( + // width: 22, + height: 22, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11), + color: theme.cautionColor, + ), + constraints: BoxConstraints( + maxWidth: 30, + minWidth: 22, + ), + child: Text( + _getTotalUnReadCount( + chatGlobalModel.totalUnReadCount), + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ), + )) + : Container(), + if (otherUserBean != null) + Positioned( + left: 40.sp, + bottom: 4.sp, + child: titleWidget(chatGlobalModel.totalUnReadCount)), ], ), - - ), body: DropTarget( onDragDone: (detail) { @@ -439,91 +469,91 @@ class _TUIChatState extends TIMUIKitState { if (widget.topFixWidget != null) widget.topFixWidget!, Expanded( child: Container( - // color: Colors.red, - color: theme.chatBgColor, - child: Align( - // key: alignKey, - alignment: Alignment.topCenter, - child: Listener( - onPointerMove: closePanel, - child: TIMUIKitHistoryMessageListContainer( - conversation: widget.conversation, - textFieldController: textFieldController, - customEmojiStickerList: + // color: Colors.red, + color: theme.chatBgColor, + child: Align( + // key: alignKey, + alignment: Alignment.topCenter, + child: Listener( + onPointerMove: closePanel, + child: TIMUIKitHistoryMessageListContainer( + conversation: widget.conversation, + textFieldController: textFieldController, + customEmojiStickerList: widget.customEmojiStickerList, - isUseDefaultEmoji: + isUseDefaultEmoji: widget.config!.isUseDefaultEmoji, - // key: listContainerKey, - isAllowScroll: true, - userAvatarBuilder: widget.userAvatarBuilder, - toolTipsConfig: widget.toolTipsConfig, - groupAtInfoList: widget.groupAtInfoList, - tongueItemBuilder: widget.tongueItemBuilder, - onLongPressForOthersHeadPortrait: - (String? userId, String? nickName) { - if (widget.conversationType != - ConvType.c2c) { - textFieldController.longPressToAt( - nickName, userId); - } - }, - mainHistoryListConfig: + // key: listContainerKey, + isAllowScroll: true, + userAvatarBuilder: widget.userAvatarBuilder, + toolTipsConfig: widget.toolTipsConfig, + groupAtInfoList: widget.groupAtInfoList, + tongueItemBuilder: widget.tongueItemBuilder, + onLongPressForOthersHeadPortrait: + (String? userId, String? nickName) { + if (widget.conversationType != + ConvType.c2c) { + textFieldController.longPressToAt( + nickName, userId); + } + }, + mainHistoryListConfig: widget.mainHistoryListConfig, - initFindingMsg: widget.initFindingMsg, - extraTipsActionItemBuilder: + initFindingMsg: widget.initFindingMsg, + extraTipsActionItemBuilder: widget.extraTipsActionItemBuilder ?? widget.exteraTipsActionItemBuilder, - conversationType: _getConvType(), - scrollController: autoController, - onTapAvatar: widget.onTapAvatar, - // ignore: deprecated_member_use_from_same_package - showNickName: widget.showNickName, - messageItemBuilder: + conversationType: _getConvType(), + scrollController: autoController, + onTapAvatar: widget.onTapAvatar, + // ignore: deprecated_member_use_from_same_package + showNickName: widget.showNickName, + messageItemBuilder: widget.messageItemBuilder, - conversationID: _getConvID(), - ), - )), - )), + conversationID: _getConvID(), + ), + )), + )), Selector( builder: (context, value, child) { return value ? MultiSelectPanel( - conversationType: _getConvType(), - ) + conversationType: _getConvType(), + ) : (widget.textFieldBuilder != null - ? widget.textFieldBuilder!(context) - : TIMInputTextField( - // key: inputTextFieldState, - atMemberPanelScroll: - atMemberPanelScroll, - groupType: - widget.conversation.groupType, - currentConversation: - widget.conversation, - model: model, - controller: textFieldController, - customEmojiStickerList: - widget.customEmojiStickerList, - isUseDefaultEmoji: - widget.config!.isUseDefaultEmoji, - customStickerPanel: - widget.customStickerPanel, - morePanelConfig: - widget.morePanelConfig, - scrollController: autoController, - conversationID: _getConvID(), - conversationType: _getConvType(), - hintText: '说些什么吧~', - showMorePanel: widget.config - ?.isAllowShowMorePanel ?? - true, - showSendAudio: widget.config - ?.isAllowSoundMessage ?? - true, - showSendEmoji: widget - .config?.isAllowEmojiPanel ?? - true, - )); + ? widget.textFieldBuilder!(context) + : TIMInputTextField( + // key: inputTextFieldState, + atMemberPanelScroll: + atMemberPanelScroll, + groupType: + widget.conversation.groupType, + currentConversation: + widget.conversation, + model: model, + controller: textFieldController, + customEmojiStickerList: + widget.customEmojiStickerList, + isUseDefaultEmoji: + widget.config!.isUseDefaultEmoji, + customStickerPanel: + widget.customStickerPanel, + morePanelConfig: + widget.morePanelConfig, + scrollController: autoController, + conversationID: _getConvID(), + conversationType: _getConvType(), + hintText: '说些什么吧~', + showMorePanel: widget.config + ?.isAllowShowMorePanel ?? + true, + showSendAudio: widget.config + ?.isAllowSoundMessage ?? + true, + showSendEmoji: widget + .config?.isAllowEmojiPanel ?? + true, + )); }, selector: (c, model) { return model.isMultiSelect; @@ -547,6 +577,110 @@ class _TUIChatState extends TIMUIKitState { )); }); } + + loadUserData() async { + String url = + "${Api.getUserInfoTA + widget.conversation.userID!.split('_').last}/home"; + var data = await DioManager.instance.get(url: url); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + + if (bean.isSuccess()) { + isLike = bean.data.isFollow; + otherUserBean = bean.data.user; + setState(() {}); + } + } + + Widget titleWidget(int msgCount) { + return otherUserBean == null + ? Container() + : GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: otherUserBean!.id!.toString()); + }, + child: Container( + margin: EdgeInsets.only(left: msgCount > 0 ? 40.sp : 0), + child: Row( + children: [ + ClipOval( + child: Image.network( + otherUserBean!.avatar!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + )), + SizedBox( + width: 4.sp, + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(otherUserBean!.nickname ?? '昵称待审核', + style: TextStyle( + color: Colors.white, + // fontSize: + // ((otherUserBean!.onlineFlag ?? '').isNotEmpty) + // ? 14.sp + // : 16.sp), + )), + // if ((otherUserBean!.onlineFlag ?? '').isNotEmpty) + // Text( + // otherUserBean!.onlineFlag ?? '', + // style: TextStyle( + // color: Colors.white.withOpacity(0.75), + // fontSize: 12.sp), + // ), + // ], + // ), + + ]), + if (!isLike) + GestureDetector( + onTap: () async { + if (!isLike) { + var data = await DioManager.instance.post( + url: "${Api.setLike + otherUserBean!.id!.toString()}/follow", + params: {'status': isLike ? "0" : "1"}); + var bean = BaseResponse.fromJson( + data, + (jsonData) => jsonData, + ); + if (bean.isSuccess()) { + + isLike = !isLike; + setState(() { + + }); + } + } else { + // addFollowHeader(); + } + }, + child: Container( + margin: EdgeInsets.only( + left: 5.sp, + ), + padding: EdgeInsets.only(left: 4.sp, right: 4.sp), + height: 22.sp, + decoration: BoxDecoration( + gradient: AppColor.mainHorLinearGradient, + borderRadius: BorderRadius.circular(14), + ), + child: Center( + child: Text( + '喜欢', + style: TextStyle( + fontSize: 12.sp, color: Colors.white)), + ), + )), + ], + ), + ), + ); + } } class TIMUIKitChatProviderScope extends StatelessWidget { diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index 9b42b5c..c0d173d 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/tim_uikit_chat.dart'; +import 'package:circle_app/app/chat/widget/more_dialog.dart'; import 'package:circle_app/app/chat/widget/send_gift_dialog.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/components/my_app_bar.dart'; @@ -16,6 +17,7 @@ import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; import '../../util/eventBus.dart'; +import '../userinfo/logic.dart'; class ChatPage extends StatefulWidget { @@ -41,6 +43,8 @@ class _ChatPageState extends State { TIMUIKitChatController(); User? userInfoBean; + UserBean? otherUserBean; + String conversationID = ''; var sub; var sub1; @override @@ -49,23 +53,41 @@ class _ChatPageState extends State { super.initState(); initEventBus(); loadMyInfo(); - loadIsShowSendGiftDialogData(); + loadUserData(); } void loadIsShowSendGiftDialogData() async { - V2TimConversation con = Get.arguments; - var data = await DioManager.instance.get(url: Api.isShow_give_gift + con!.conversationID!.split('_').last); + var data = await DioManager.instance.get(url: Api.isShow_give_gift + conversationID.split('_').last); + if (data['code'] == 200) { if (data['data']) { - Get.bottomSheet(SendGiftDialog(accid: con!.conversationID!,title: data['msg'],), isScrollControlled: true, + Get.bottomSheet(SendGiftDialog(accid: conversationID,title: data['msg'],), isScrollControlled: true, enableDrag: false); } } } + loadUserData() async { + V2TimConversation con = Get.arguments; + conversationID = con!.conversationID!; + String url = "${Api.getUserInfoTA + conversationID.split('_').last}/home"; + var data = await DioManager.instance.get(url: url); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + + if (bean.isSuccess()) { + otherUserBean = bean.data.user; + setState(() { + + }); + } + + loadIsShowSendGiftDialogData(); + } + initEventBus()async{ sub = EventBusManager.on().listen((event) async{ @@ -190,14 +212,26 @@ class _ChatPageState extends State { ], ), customAppBar:MyAppBar( - centerTitle: con != null ? con.showName! : '', + centerTitle: '', actionWdiget: GestureDetector( - onTap: () async{ - var data = await Get.toNamed(AppRoutes.UserInfoActivity,arguments: con.userID.toString().split('_').last,preventDuplicates: false); - - }, - child: Text('查看主页',style: TextStyle(color: const Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),), - ), + onTap: () { + Get.bottomSheet( + MoreDialog( + sessionId: conversationID, + userId: (otherUserBean?.id ?? 0) > 0 ? otherUserBean!.id!.toString() : '', + deleteMsgCallBack: () { + // context.read().clearMsg(); + // ChatViewModel viewModel = context.read(); + // viewModel.messageList.clear(); + // viewModel.notifyListeners(); + }), + isScrollControlled: true); + // defaultAvatarTap(widget.sessionId, isSelf:false); + }, + child: Image.asset( + getMsgImage('msg_more'), + width: 24.sp, + )), onPressed: () {}, ), @@ -246,6 +280,84 @@ class _ChatPageState extends State { } } } + + Widget titleWidget() { + return userInfoBean == null + ? Container() + : GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: userInfoBean!.id!.toString()); + }, + child: Container( + margin: + EdgeInsets.only(left: 0 > 99 ? 80.sp : 65.sp), + child: Row( + children: [ + ClipOval( + child: Image.network( + otherUserBean!.avatar!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + )), + SizedBox( + width: 4.sp, + ), + // Column( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Text( + // userInfoBean!.nickname ?? '昵称待审核', + // style: TextStyle( + // color: Colors.white, + // fontSize: + // ((otherUserBean!.onlineFlag ?? '').isNotEmpty) + // ? 14.sp + // : 16.sp), + // ), + // if ((otherUserBean!.onlineFlag ?? '').isNotEmpty) + // Text( + // otherUserBean!.onlineFlag ?? '', + // style: TextStyle( + // color: Colors.white.withOpacity(0.75), + // fontSize: 12.sp), + // ), + // ], + // ), + // if (otherUserBean!.! <= 1 )) + // GestureDetector( + // onTap: () { + // if (userInfoBean!.followStatus! <= 1) { + // setFollow(); + // } else { + // addFollowHeader(); + // } + // }, + // child: Container( + // margin: EdgeInsets.only( + // left: 5.sp, + // ), + // padding: EdgeInsets.only(left: 4.sp, right: 4.sp), + // height: 22.sp, + // decoration: BoxDecoration( + // gradient: AppColor.newMainVerLinearGradient, + // borderRadius: BorderRadius.circular(14), + // ), + // child: Center( + // child: Text( + // userInfoBean!.followStatus! <= 1 ? '关注' : '+特别关心', + // style: TextStyle( + // fontSize: 12.sp, color: Colors.white)), + // ), + // ), + // ), + ], + ), + ), + ); + } } diff --git a/circle_app/lib/app/chat/widget/more_dialog.dart b/circle_app/lib/app/chat/widget/more_dialog.dart new file mode 100644 index 0000000..9a7a6fd --- /dev/null +++ b/circle_app/lib/app/chat/widget/more_dialog.dart @@ -0,0 +1,475 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_conversation_controller.dart'; +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../../router/app_routers.dart'; +import '../../../util/eventBus.dart'; +import '../../../util/util.dart'; +import '../../userinfo/logic.dart'; +import 'package:provider/provider.dart'; + +class MoreDialog extends StatefulWidget { + String userId; + String sessionId; + Function deleteMsgCallBack; + MoreDialog( + {super.key, + required this.sessionId, + required this.userId, + required this.deleteMsgCallBack}); + + @override + _MoreDialogState createState() => new _MoreDialogState(); +} + +class _MoreDialogState extends State { + // TODO: add state variables and methods + // late ChatViewModel _viewModel; + bool isTop = false; + bool isBlack = false; + UserBean? userBean; + + + @override + void initState() { + // TODO: implement initState + super.initState(); + + loadIsTop(); + getUserData(); + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Scaffold( + backgroundColor: Colors.transparent, + body: userBean != null + ? Column( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.back(); + }, + child: Container())), + Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0), + ), + gradient: LinearGradient( + colors: [ + Color(0xFF4A3E5D), + Color(0xFF344143), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + height: 118.0, + width: double.infinity, + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: GestureDetector( + onTap: () async { + Get.back(); + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: widget.userId); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: + AssetImage(getMineImage("im_right_look")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + "查看主页", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ), + Expanded( + child: GestureDetector( + onTap: () { + Navigator.pop(context); + Get.toNamed(AppRoutes.ReportActivity, + arguments: {"userId": widget.userId}); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMsgImage("msg_report")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: const Text( + "举报", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + )), + Expanded( + child: GestureDetector( + onTap: () { + Get.back(); + if (!isBlack) { + _showReportDialog(Get.context!); + } else { + cancelBlack(); + } + // Navigator.pop(context); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMsgImage("msg_add_black")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + (isBlack) ? '取消拉黑' : " 拉黑 ", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + )), + Expanded( + child: GestureDetector( + onTap: () { + // Navigator.pop(context); + addTop(isTop, widget.sessionId); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMineImage("im_first")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + isTop ? '取消置顶' : "聊天置顶", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + )), + Expanded( + child: GestureDetector( + onTap: () { + clearMsg(widget.sessionId); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMineImage("im_visit")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + "清空记录", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + )), + ], + ), + ) + ], + ) + : loaddingWidget(true), + ); + } + + void _showReportDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 277.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(22.0.sp), + // gradient: const LinearGradient( + // colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + // begin: Alignment.topCenter, + // end: Alignment.bottomCenter, + // ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + child: Image.asset(getMineImage("im_neglect")), + ), + Container( + margin: EdgeInsets.only(top: 12.sp), + child: Column( + children: [ + Center( + child: Text( + "是否拉黑", + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + Container( + margin: EdgeInsets.only(top: 14.sp), + alignment: Alignment.center, + child: Image( + image: AssetImage(getMineImage("icon_dialog_black")), + width: 70.sp, + height: 70.sp, + ), + ), + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + "拉黑后,你将屏蔽对方的任何信息若您关注了对方,将自动取消关注。", + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + margin: EdgeInsets.only(top: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: const Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () { + Get.back(); + setBlock(); + }, + child: Container( + margin: EdgeInsets.only(top: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: const Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + + //聊天置顶 + addTop(bool status, String sessionId) async { + //会话置顶 + V2TimCallback pinConversationRes = await TencentImSDKPlugin.v2TIMManager + .getConversationManager() + .pinConversation( + conversationID: widget.sessionId,//需要修改置顶属性的会话id + isPinned: !status);//是否置顶 + if (pinConversationRes.code == 0) { + //设置置顶成功 + if (!status) { + isTop = true; + showOKToast('置顶成功'); + } else { + showOKToast('取消置顶成功'); + isTop = false; + } + setState(() {}); + } + + } + + //清空聊天记录 + clearMsg(String sessionId) async { + String userId = widget.sessionId.replaceAll("c2c_", ''); + //清空单聊本地及云端的消息(不删除会话) + V2TimCallback clearC2CHistoryMessageRes = await TencentImSDKPlugin + .v2TIMManager + .getMessageManager() + .clearC2CHistoryMessage(userID:userId); // 需要清空记录的用户id + if (clearC2CHistoryMessageRes.code == 0) { + EventBusManager.fire(ClearMsg()); + //清除成功 + showOKToast('记录清空成功'); + Get.back(); + } + } + + void loadIsTop() async { + V2TimValueCallback getConversationtRes = + await TencentImSDKPlugin.v2TIMManager + .getConversationManager() + .getConversation(conversationID: widget.sessionId);//会话唯一 ID,如果是 C2C 单聊,组成方式为 c2c_userID,如果是群聊,组成方式为 group_groupID + if (getConversationtRes.code == 0) { + isTop = getConversationtRes.data?.isPinned ?? false; + setState(() { + + }); + } + } + + void getUserData() async { + var data = await DioManager.instance.get( + url: Api.getUserInfoTA + widget.userId + '/home', + ); + + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + + if (bean.isSuccess()) { + userBean = bean.data.user; + var result = await DioManager.instance + .get(url: '${Api.setBlock + widget.userId}/block'); + isBlack = result["data"]["status"] == 1; + + setState(() {}); + } + } + + setBlock() async { + setBlack("1"); + } + + cancelBlack() async { + setBlack("0"); + } + + void setBlack(String status) async { + List parts = widget.sessionId.split('_'); + if (parts[2] == "10") { + showOKToast("不可拉黑客服号哦~"); + return; + } + var data = await DioManager.instance.post( + url: "${Api.setBlock + widget.userId}/block", + params: {'status': status}); + var bean = BaseResponse.fromJson( + data, + (jsonData) => jsonData, + ); + if (bean.isSuccess()) { + final FriendshipServices _friendshipServices = + serviceLocator(); + + isBlack = status == "1"; + try { + if (isBlack) { + // Navigator.pop(Get.context!); + var result = await _friendshipServices + .addToBlackList(userIDList: [widget.sessionId]); + showOKToast("拉黑成功"); + } else { + var result = await _friendshipServices + .deleteFromBlackList(userIDList: [widget.sessionId]); + showOKToast("取消拉黑成功"); + } + // await Future.delayed(Duration(milliseconds: 500)); + // Future.delayed(Duration(seconds: 3),() { + EventBusManager.fire( + CommentBlackEvent(userId: widget.userId, isBlack: isBlack)); + // }); + } catch (e) {} + } + } +} + +class ClearMsg { +} diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index aed6b4e..61c81c6 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -67,7 +67,7 @@ class CircleLogic extends GetxController { getCityList(); // getBanner(); - // getNearByList(); + getNearByList(); EventBusManager.on().listen((event) { @@ -395,6 +395,7 @@ class VicinityItemBean { final String birthday; final int age; final int vip; + final int mark; final int gender; final int role; final int orientation; @@ -418,6 +419,7 @@ class VicinityItemBean { required this.avatar, required this.signature, required this.birthday, + required this.mark, required this.age, required this.vip, required this.gender, @@ -446,6 +448,7 @@ class VicinityItemBean { id: json['id'], nickname: json['nickname'], avatar: json['avatar'], + mark: json['mark'] ?? 0, signature: json['signature'], birthday: json['birthday'], age: json['age'], diff --git a/circle_app/lib/app/circle/state.dart b/circle_app/lib/app/circle/state.dart index a87fd99..553d83e 100644 --- a/circle_app/lib/app/circle/state.dart +++ b/circle_app/lib/app/circle/state.dart @@ -136,6 +136,7 @@ class User { int? gender; int? age; int? id; + int? mark; double? lat; double? lng; String? nickname; @@ -150,6 +151,7 @@ class User { this.gender, this.id, this.lat, + this.mark, this.lng, this.age, this.nickname, @@ -162,6 +164,7 @@ class User { avatar = json['avatar']; city = json['city']; gender = json['gender']; + mark = json['mark'] ?? 0; id = json['id']; age = json['age'] ?? 0; lat = json['lat'] ?? 0.0; diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index b8a454e..be74ac4 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -725,7 +725,7 @@ class _CirclePageState extends State ), Tab( child: Text( - '发现', + '精选', style: TextStyle( fontSize: 18.sp, ), @@ -793,14 +793,19 @@ class _CirclePageState extends State children: [ InkWell( onTap: () { - Get.bottomSheet( - TodayPeopleDialog(isShow:true), - isScrollControlled: true, - enableDrag: false, - ); + if (_tabController.index == 1 ) { + navigateToQueen(); + } else { + Get.bottomSheet( + TodayPeopleDialog(isShow:true), + isScrollControlled: true, + enableDrag: false, + ); + } + }, child: Image.asset( - getMsgImage('heart_icon'), + _tabController.index == 1 ? getCircleImage('QA_icon') : getMsgImage('heart_icon'), width: 24.sp, ), ), diff --git a/circle_app/lib/app/circle/widgets/discover.dart b/circle_app/lib/app/circle/widgets/discover.dart index 45e9495..c44ecbe 100644 --- a/circle_app/lib/app/circle/widgets/discover.dart +++ b/circle_app/lib/app/circle/widgets/discover.dart @@ -392,7 +392,7 @@ class _DiscoverState extends State child: CachedNetworkImage( imageUrl: user.images![index], fit: BoxFit.cover, - width: Get.width, + // width: Get.width, height: screenHeight, )); },itemCount: user.images!.length,) diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index 8838a95..e77c37f 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -21,6 +21,7 @@ import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../../../common/Widgets/tag_widget.dart'; import '../../../util/SharedPreferencesHelper.dart'; import '../../../util/eventBus.dart'; import '../../circle_list/logic.dart'; @@ -847,12 +848,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien SizedBox( width: 8.sp, ), - lists.user?.vip != null && lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), - width: 36.sp, - ) + UserTagWidget(lists.user!.mark!), ], ), SizedBox( @@ -1158,12 +1154,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien SizedBox( width: 8.sp, ), - lists.user?.vip != null && lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), - width: 36.sp, - ) + UserTagWidget(lists.user!.mark!), ], ), SizedBox( diff --git a/circle_app/lib/app/circle/widgets/like_view.dart b/circle_app/lib/app/circle/widgets/like_view.dart index c508df0..f7903b8 100644 --- a/circle_app/lib/app/circle/widgets/like_view.dart +++ b/circle_app/lib/app/circle/widgets/like_view.dart @@ -21,6 +21,7 @@ import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../../common/Widgets/base_tip_widget.dart'; +import '../../../common/Widgets/tag_widget.dart'; class LikeView extends StatefulWidget { @override @@ -627,15 +628,16 @@ class _LikeViewState extends State SizedBox( width: 8.sp, ), - lists.user?.vip != null && - lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 - ? 'vip' - : 'year_vip'), - width: 36.sp, - ) + UserTagWidget(lists.user!.mark!), + // lists.user?.vip != null && + // lists.user!.vip == 0 + // ? Container() + // : Image.asset( + // getCircleImage(lists.user!.vip == 1 + // ? 'vip' + // : 'year_vip'), + // width: 36.sp, + // ) ], ), SizedBox( @@ -933,15 +935,7 @@ class _LikeViewState extends State SizedBox( width: 8.sp, ), - lists.user?.vip != null && - lists.user!.vip == 0 - ? Container() - : Image.asset( - getCircleImage(lists.user!.vip == 1 - ? 'vip' - : 'year_vip'), - width: 36.sp, - ) + UserTagWidget(lists.user!.mark!), ], ), SizedBox( diff --git a/circle_app/lib/app/circle/widgets/vicinity.dart b/circle_app/lib/app/circle/widgets/vicinity.dart index a07fde9..244bb57 100644 --- a/circle_app/lib/app/circle/widgets/vicinity.dart +++ b/circle_app/lib/app/circle/widgets/vicinity.dart @@ -13,6 +13,8 @@ import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import '../../../common/Widgets/tag_widget.dart'; + class Vicinity extends StatefulWidget { CircleLogic logic; // TODO: add state variables, methods and constructor params @@ -457,12 +459,7 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin ), ), const SizedBox(width: 6), - if (item.vip > 0) - Image( - image: AssetImage(getBaseImage(item.vip == 1 ? "vip" : 'year_vip')), - width: 44.sp, - height: 18.sp, - ), + UserTagWidget(item.mark!), ], ); } diff --git a/circle_app/lib/app/circle_list/logic.dart b/circle_app/lib/app/circle_list/logic.dart index 855fbca..1d18af5 100644 --- a/circle_app/lib/app/circle_list/logic.dart +++ b/circle_app/lib/app/circle_list/logic.dart @@ -128,6 +128,7 @@ class LikeLogic extends GetxController { void relaodData() { page = 1; + isMore = true; loadCircleListData(); } diff --git a/circle_app/lib/app/dialog/UpdateDialog.dart b/circle_app/lib/app/dialog/UpdateDialog.dart index 4cada6a..b247693 100644 --- a/circle_app/lib/app/dialog/UpdateDialog.dart +++ b/circle_app/lib/app/dialog/UpdateDialog.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_install_app/flutter_install_app.dart'; +// import 'package:flutter_install_app/flutter_install_app.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -140,7 +140,7 @@ class _CustomDialogState extends State { child:isShowWeb? Container( margin: EdgeInsets.only(top: 10.sp), child: Text( - "下载太慢?试试游览器下载吧。", + "下载太慢?试试浏览器下载吧。", style: TextStyle( color: Colors.blue, // 设置蓝色颜色 decoration: @@ -171,11 +171,11 @@ class _CustomDialogState extends State { if (appStoreUrl.contains("apk")) { updataApk(appStoreUrl); setDownloadUi(); - await Future.delayed(Duration(seconds: 10)); - setState(() { - isShowWeb = true; + Future.delayed(Duration(seconds: 10),() { + setState(() { + isShowWeb = true; + }); }); - } else { if (await canLaunch(appStoreUrl)) { await launch(appStoreUrl, @@ -262,7 +262,7 @@ class _CustomDialogState extends State { print(error); }); DioManager.instance.setReceiveTimeout(30); - await AppInstaller.installApk(filePath, actionRequired: false); + // await AppInstaller.installApk(filePath, actionRequired: false); } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index e936c8b..b6835a1 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -34,6 +34,7 @@ import '../circle/view.dart'; import '../circle_list/logic.dart'; import '../circle_list/view.dart'; import '../dialog/UpdateDialog.dart'; +import '../invite/logic.dart'; import '../minefragment/view.dart'; import '../msg/view.dart'; import 'state.dart'; @@ -42,7 +43,7 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { late TabController tabController; var connectivitySub; ConnectivityResult? currentResult; - + User? model; int currentIndex = 0; Widget currentPage = Container(); @@ -65,6 +66,10 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { bool isProd = true; String accountId = ''; + + String inviteCode = ''; + + var link = ''; @override void onClose() { // TODO: implement onClose @@ -87,6 +92,7 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { setFirstData(); + loadMyInfoData(); tabs.add(CirclePage()); tabs.add(CircleListPage()); tabs.add(MsgPage()); @@ -373,10 +379,10 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { if (index == 0) { final logic = Get.put(CircleLogic()); logic.loadCirclePeopleData(); - } else if (index == 3) { + } else if (index == 4) { final logic = Get.put(MinefragmentLogic()); logic.getMode(); - } else if (index == 2) { + } else if (index == 3) { final logic = Get.find(); EventBusManager.fire(MsgRecommendCardRefresh()); logic.loadChatData(); @@ -449,10 +455,10 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { } else if (currentIndex == 1) { var logic = Get.put(LikeLogic()); logic.loadData(); - } else if (currentIndex == 2) { + } else if (currentIndex == 3) { final logic = Get.find(); logic.loadData(); - } else if (currentIndex == 3) { + } else if (currentIndex == 4) { var logic = Get.put(MinefragmentLogic()); logic.loadData(); } @@ -467,6 +473,24 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { } } + void loadMyInfoData() async { + var data = await DioManager.instance.get(url: Api.getUserMine); + var bean = BaseResponse.fromJson( + data, (data) => MineResponseBean.fromJson(data)); + if (bean.isSuccess()) { + model = bean.data.user; + var result = await DioManager.instance.get(url: Api.inviteMainPage); + if (result['code'] == 200) { + Autogenerated info = Autogenerated.fromJson(result); + inviteCode = info.data!.inviteCode!; + link = info.data!.link!; + } + + } + } + + + } diff --git a/circle_app/lib/app/home/view.dart b/circle_app/lib/app/home/view.dart index 915807c..4437e38 100644 --- a/circle_app/lib/app/home/view.dart +++ b/circle_app/lib/app/home/view.dart @@ -1,6 +1,7 @@ import 'package:circle_app/app/circle/view.dart'; import 'package:circle_app/app/minefragment/view.dart'; import 'package:circle_app/app/msg/view.dart'; +import 'package:circle_app/common/colors/app_color.dart'; import 'package:circle_app/util/util.dart'; import 'package:circle_app/view/ExitAppConfirmation.dart'; import 'package:flutter/material.dart'; @@ -19,7 +20,10 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin,RouteAware { + with + AutomaticKeepAliveClientMixin, + SingleTickerProviderStateMixin, + RouteAware { @override bool get wantKeepAlive => true; @@ -29,7 +33,7 @@ class _HomePageState extends State // TODO: implement initState super.initState(); logic.tabController = TabController( - length: 4, + length: 5, vsync: this, initialIndex: 0, animationDuration: Duration.zero); @@ -44,7 +48,6 @@ class _HomePageState extends State routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); } - void didPopNext() { print('didPopNext'); logic.getUnreadSize(); @@ -53,13 +56,12 @@ class _HomePageState extends State ///当前页面进入时触发 void didPush() { print('didPopNext'); - } + void didPop() { print('didPop'); } - @override void dispose() { // TODO: implement dispose @@ -67,7 +69,6 @@ class _HomePageState extends State routeObserver.unsubscribe(this); } - @override Widget build(BuildContext context) { return GetBuilder(builder: (HomeLogic controller) { @@ -79,7 +80,7 @@ class _HomePageState extends State height: 49.sp + MediaQuery.of(context).padding.bottom, width: Get.width, // color: Colors.red, - padding: EdgeInsets.only(left: 20.sp, right: 20.sp), + padding: EdgeInsets.only(left: 10.sp, right: 10.sp), decoration: BoxDecoration( color: const Color(0xFF423055), image: DecorationImage( @@ -93,8 +94,9 @@ class _HomePageState extends State children: [ funcItem(0, 'circle', 0 == controller.currentIndex, controller), funcItem(1, 'like', 1 == controller.currentIndex, controller), - funcItem(2, 'msg', 2 == controller.currentIndex, controller), - funcItem(3, 'mine', 3 == controller.currentIndex, controller), + centerItem(2, 'call', 2 == controller.currentIndex, controller), + funcItem(3, 'msg', 3 == controller.currentIndex, controller), + funcItem(4, 'mine', 4 == controller.currentIndex, controller), ], ), ), @@ -113,6 +115,7 @@ class _HomePageState extends State children: [ const CirclePage(), CircleListPage(), + Container(), MsgPage(), MinefragmentPage() ], @@ -124,9 +127,57 @@ class _HomePageState extends State }); } + centerItem(int index, String image, bool isSelected, HomeLogic controller) { + return SizedBox( + width: 50.sp, + height: 50.sp, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (!isSelected) { + logic.tabController.animateTo(index, + duration: Duration(milliseconds: 0), curve: Curves.ease); + controller.updateIndex(index); + } + }, + child: OverflowBox( + minWidth: 0.0, + maxWidth: double.infinity, + minHeight: 0.0, + maxHeight: double.infinity, + child: Container( + width: 60.sp, + height: 60.sp, + margin: EdgeInsets.only(bottom: 4.sp), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Color(0xFF460358), + Color(0xFF400350), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.circular(30.sp) + ), + child: Center( + child: Image.asset( + isSelected + ? getTabbarImage('${image}_selected') + : getTabbarImage('${image}_normal'), + width: 50.sp, + height: 50.sp, + fit: BoxFit.fill, + excludeFromSemantics: true, + gaplessPlayback: true, + ))), + ), + )); + } + funcItem(int index, String image, bool isSelected, HomeLogic controller) { return SizedBox( - width: 80.sp, + width: 50.sp, height: 50.sp, child: GestureDetector( behavior: HitTestBehavior.opaque, @@ -139,7 +190,7 @@ class _HomePageState extends State }, child: Stack(alignment: Alignment.center, children: [ Container( - margin: EdgeInsets.only(top: 8.sp), + margin: EdgeInsets.only(top: index == 2 ? 0 : 8.sp), child: Center( child: Image.asset( isSelected @@ -172,7 +223,7 @@ class _HomePageState extends State ))), // Obx(() => null) Obx(() => Visibility( - visible: index == 2 && controller.unreadSIze != "0", + visible: index == 3 && controller.unreadSIze != "0", child: Positioned( // right: 4.sp, top: 6.sp, diff --git a/circle_app/lib/app/login/login/logic.dart b/circle_app/lib/app/login/login/logic.dart index 5f4fc3f..ffef3db 100644 --- a/circle_app/lib/app/login/login/logic.dart +++ b/circle_app/lib/app/login/login/logic.dart @@ -42,15 +42,20 @@ class LoginLogic extends GetxController { String loginPhone = await sharedPreferences.getString(SharedPreferencesHelper.LOGINPHONE) ?? ""; + String pwd = + await sharedPreferences.getString(SharedPreferencesHelper.PWD) ?? + ""; print(loginPhone); phoneEditingController.text = loginPhone; if (GetUtils.isPhoneNumber(loginPhone) && loginPhone.length == 11) { isPhone = true; + } if (sharedPreferences!.containsKey(SharedPreferencesHelper.firstLogin)) { loginType = 1; + pwdEditingController.text = pwd; } update(); @@ -192,6 +197,12 @@ class LoginLogic extends GetxController { } } } else { + if (loginType == 1) { + SharedPreferencesHelper.getInstance().then((sharedPreferences) { + sharedPreferences.setString( + SharedPreferencesHelper.PWD, pwdEditingController.text); + }); + } var data = await DioManager.instance.put(url: Api.refreshToken, params: {}); var bean = BaseResponse.fromJson( 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 bc4745b..f42cea5 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -30,6 +30,7 @@ import '../../../router/app_routers.dart'; import '../../../util/eventBus.dart'; import '../../../util/util.dart'; import '../../circle/widgets/discover.dart'; +import '../recommend_circle_friend_item.dart'; import 'tim_uikit_conversation_item.dart'; typedef TIMConversationItemBuilder = Widget Function( @@ -169,6 +170,8 @@ class _TIMConversationState extends TIMUIKitState { // final TUIFriendShipViewModel friendShipViewModel = // serviceLocator(); bool hasMore = true; + var sub; + List chatImIdList = []; Map recommendCircleFriendData = {}; @override @@ -485,7 +488,9 @@ class _TIMConversationState extends TIMUIKitState { itemBuilder: (context, index) { if (index == filteredConversationList.length) { return recommendCircleFriendData.isNotEmpty - ? recommendCircleFriendWidget() + ? RecommendCircleFriendItem(recommendCircleFriendData: recommendCircleFriendData,getDataCallBack: () { + loadRecommendCircleFriendData(); + }) : Container(); } @@ -515,6 +520,7 @@ class _TIMConversationState extends TIMUIKitState { V2TimUserFullInfo? userFullInfo; bool isOfficial = false; bool isSameCity = false; + int mark = 0; if (snapshot.connectionState == ConnectionState.done) { if ((snapshot.data ?? []).isNotEmpty) { @@ -534,17 +540,22 @@ class _TIMConversationState extends TIMUIKitState { .toList() .first; + if (userFullInfo!.customInfo! .containsKey('Label')) { if (userFullInfo!.customInfo!['Label'] .toString() .isNotEmpty) { - var otherInfo = jsonDecode(userFullInfo! + Map otherInfo = jsonDecode(userFullInfo! .customInfo!['Label'] .toString()); Map myInfo = jsonDecode(myuserFullInfo! .customInfo!['Label'] .toString()); + + if (otherInfo.containsKey('mark')) { + mark = otherInfo['mark'] ?? 0; + } if (myInfo != null) { if (myInfo.containsKey('city')) { if (myInfo['city'].toString().contains( @@ -575,6 +586,7 @@ class _TIMConversationState extends TIMUIKitState { color: Colors.transparent, child: InkWell( child: TIMConversationItem( + mark:mark, isSameCity: isSameCity, isOfficial: isOfficial, isCurrent: isCurrent, 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 cc57237..7575a6e 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 @@ -4,6 +4,7 @@ import 'dart:convert'; 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/common/Widgets/tag_widget.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -25,6 +26,7 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { final String nickName; final V2TimMessage? lastMsg; final int unreadCount; + final int mark; final bool isPined; final List groupAtInfoList; final String? draftText; @@ -47,6 +49,7 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { Key? key, required this.isShowDraft, required this.faceUrl, + required this.mark, required this.isSameCity, required this.nickName, required this.lastMsg, @@ -242,14 +245,10 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { ) ), child: Text('官方',style: TextStyle(color: Color(0xFFF7FAFA),fontSize: 10.sp,fontWeight: FontWeight.w600),),), - if (vipType > 0) + // if (vipType > 0) Container( margin: EdgeInsets.only(left: 5.sp,), - child: Image( - image: AssetImage(getBaseImage(vipType == 2 ? 'year_vip' : "vip")), - width: 44.sp, - height: 20.sp, - ) ,), + child: UserTagWidget(mark)), Expanded( child:Container()), diff --git a/circle_app/lib/app/msg/recommend_circle_friend_item.dart b/circle_app/lib/app/msg/recommend_circle_friend_item.dart new file mode 100644 index 0000000..2c0ecb2 --- /dev/null +++ b/circle_app/lib/app/msg/recommend_circle_friend_item.dart @@ -0,0 +1,588 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; + +import '../../common/colors/app_color.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import '../../router/app_routers.dart'; +import '../../util/util.dart'; +import '../circle/widgets/discover.dart'; + +class RecommendCircleFriendItem extends StatefulWidget { + RecommendCircleFriendItem({super.key,required this.recommendCircleFriendData,required this.getDataCallBack}); + var recommendCircleFriendData; + Function getDataCallBack; + @override + _RecommendCircleFriendItemState createState() => + _RecommendCircleFriendItemState(); +} + +class _RecommendCircleFriendItemState extends State { + // TODO: add state variables and methods + var recommendCircleFriendData; + + @override + Widget build(BuildContext context) { + recommendCircleFriendData = widget.recommendCircleFriendData; + // TODO: add widget build method + ErrorWidget.builder = (FlutterErrorDetails errorDetails) => Container(); + + return recommendCircleFriendData == null ? Container() : recommendCircleFriendWidget(); + } + + + recommendCircleFriendWidget() { + try { + var info = {}; + + var user = Users.fromJson(recommendCircleFriendData['user']); + + // 对方喜欢了你100 + // ·你们有共同喜欢的圈友90 + // ·你喜欢的圈友也喜欢TA80 + // ·你们都在深圳留下过足迹70 + // ·你们有2个共同的圈子:圈子名称、圈子名称60 + // ·我刚来到这里哦55 + // ·可能是你想认识的人50 + // ·很多圈友都喜欢TA40 + // ·TA是乐园优秀圈主哦~30 + + info = checkCardReturnData(recommendCircleFriendData); + + List circleList = recommendCircleFriendData['interests'] ?? []; + + return Container( + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Column(children: [ + Container( + margin: EdgeInsets.only(top: 20.sp), + child: Row( + children: [ + Expanded( + child: Container( + height: 2.sp, + color: Colors.white.withOpacity(0.5), + )), + Container( + width: 4.sp, + height: 4.sp, + margin: EdgeInsets.only(left: 15.sp, right: 15.sp), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity(0.5)), + ), + Expanded( + child: Container( + height: 2.sp, + color: Colors.white.withOpacity(0.5), + )), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 16.sp), + child: Row( + children: [ + Image.asset( + getMsgImage('heart_icon'), + width: 18.sp, + ), + SizedBox( + width: 4.sp, + ), + ShaderMask( + shaderCallback: (Rect bounds) { + return const LinearGradient( + begin: Alignment(0.0, -1.0), + end: Alignment.bottomCenter, + colors: [Color(0xff71F3F2), Color(0xffF657FF)], + ).createShader(Offset.zero & bounds.size); + }, + child: Text( + '圈友推荐', + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + shadows: [ + Shadow( + color: Color(0xffF657FF), + offset: Offset(0.0, -1)) + ]), + ), + ), + SizedBox( + width: 4.sp, + ), + Image.asset( + getMsgImage('heart_icon'), + width: 18.sp, + ), + Expanded(child: Container()), + InkWell( + onTap: () { + widget.getDataCallBack(); + }, + child: Container( + child: Row( + children: [ + Icon( + Icons.refresh_sharp, + size: 18.sp, + color: AppColor.mainColor, + ), + SizedBox( + width: 4.sp, + ), + Text( + '换一位', + style: TextStyle( + color: AppColor.mainColor, fontSize: 15.sp), + ) + ], + ), + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 16.sp), + width: Get.width, + // constraints: BoxConstraints(maxHeight: 230.sp), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)]), + borderRadius: BorderRadius.circular(8.sp), + border: GradientBoxBorder( + gradient: AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + padding: EdgeInsets.only(left: 12.sp, right: 12.sp, top: 10.sp), + child: Column( + children: [ + GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: user.userId.toString()); + }, + child: Container( + child: Row( + children: [ + ClipOval( + child: Image.network( + recommendCircleFriendData['user']['avatar'], + width: 50.sp, + height: 50.sp, + fit: BoxFit.cover, + ), + ), + SizedBox( + width: 6.sp, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + user.nickname ?? '', + style: TextStyle( + fontSize: 16.sp, + color: Color(0XFFF7FAFA), + fontWeight: FontWeight.bold), + ), + SizedBox( + width: 8.sp, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + ShaderMask( + shaderCallback: (Rect bounds) { + return const LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xff71F3F2), + Color(0xffF657FF) + ], + ).createShader( + Offset.zero & bounds.size); + }, + child: Text( + '匹配度' + + (recommendCircleFriendData[ + 'recommend_score'] + .toString() ?? + '') + + '%', + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: Colors.white), + ), + ), + ], + ) + ], + ), + SizedBox( + height: 4.sp, + ), + Row( + children: [ + Container( + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only( + left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(9.sp), + gradient: const LinearGradient( + begin: Alignment(0.25, 0.5), + end: Alignment(0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + Color(0xffB5D3FF) + ])), + child: Text( + getAgeCOntent( + user!.gender ?? 0, + user!.age ?? 0, + user!.role ?? 0, + user!.orientation ?? 0), + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ), + if (user.vip! > 0) + Container( + margin: EdgeInsets.only( + left: 4.sp, + ), + child: Image.asset( + getCircleImage( + user.vip == 1 ? 'vip' : 'year_vip'), + width: 36.sp, + ), + ), + ], + ), + ], + )), + GestureDetector( + onTap: () async { + V2TimValueCallback + getConversationtRes = await TencentImSDKPlugin + .v2TIMManager + .getConversationManager() + .getConversation( + conversationID: + 'c2c-${recommendCircleFriendData['user']['imId']}'); //会话唯一 ID,如果是 C2C 单聊,组成方式为 c2c_userID,如果是群聊,组成方式为 group_groupID + if (getConversationtRes.code == 0) { + if (getConversationtRes.data?.lastMessage == null) { + await createCustomMsg(user.userId.toString(), + recommendCircleFriendData['user']['imId']); + } + } else { + await createCustomMsg(user.userId.toString(), + recommendCircleFriendData['user']['imId']); + } + // if (!chatImIdList.contains(user.userId.toString())) { + // await createCustomMsg(user.userId.toString(), recommendCircleFriendData['user']['imId']); + // } + + pushChatPage( + user.userId.toString(), + recommendCircleFriendData['user']['imId'], + user.nickname!); + }, + child: Container( + height: 25.sp, + padding: EdgeInsets.only(left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(12.5.sp)), + alignment: Alignment.center, + child: Text( + '聊一聊', + style: TextStyle( + color: Colors.white, fontSize: 15.sp), + ), + ), + ) + ], + ), + ), + ), + if (info.containsKey('desc')) + Container( + margin: EdgeInsets.only(top: 10.sp, right: 16.sp), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.sp), + width: 3, + height: 3, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(1.5), + color: Color(0xFF00FFF4)), + ), + Expanded( + child: Container( + child: Text( + info['desc'], + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ) + ], + ), + ), + if (info.containsKey('city')) + info['city'].toString().isNotEmpty + ? Container( + margin: EdgeInsets.only(top: 10.sp), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.sp), + width: 3.sp, + height: 3.sp, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(1.5.sp), + color: Color(0xFF00FFF4)), + ), + Expanded( + child: Text( + info['city'], + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500), + )) + ], + ), + ) + : Container(), + if (info.containsKey('both_interests')) + Container( + margin: EdgeInsets.only(top: 10.sp, right: 16.sp), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.sp), + width: 3, + height: 3, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(1.5), + color: Color(0xFF00FFF4)), + ), + Expanded( + child: Container( + child: Text( + info['both_interests'], + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), + alignment: Alignment.centerLeft, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(right: 5.sp, top: 10.sp), + width: 3, + height: 3, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(1.5), + color: Color(0xFF00FFF4)), + ), + Expanded( + child: Text( + '交友宣言:' + + recommendCircleFriendData['user'] + ['signature'], + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500), + maxLines: 2, + overflow: TextOverflow.ellipsis, + )), + ])), + Image.asset( + getCircleImage('line'), + width: Get.width, + fit: BoxFit.fill, + ), + if (circleList.isNotEmpty) + Container( + height: 72.sp, + margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), + width: Get.width, + child: ListView.builder( + itemBuilder: (context, index) { + return CircleInfoItem( + bean: circleList[index], index: index); + }, + itemCount: circleList.length, + scrollDirection: Axis.horizontal, + ), + ) + ], + ), + ), + ])); + } catch (e) { + // widget.getDataCallBack(); + return Container(); + } + } +} + +class CircleInfoItem extends StatefulWidget { + var bean; + int index; + + CircleInfoItem({super.key, required this.bean, required this.index}); + @override + _CircleInfoItemState createState() => _CircleInfoItemState(); +} + +class _CircleInfoItemState extends State { + // TODO: add state variables and methods + + var bean; + int index = 0; + + @override + void initState() { + // TODO: implement initState + super.initState(); + bean = widget.bean; + index = widget.index; + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return circleInfoItem(); + } + + circleInfoItem() { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Signal_circle_list, + arguments: bean['id'].toString()); + }, + child: Container( + margin: EdgeInsets.only(right: 10.sp), + padding: EdgeInsets.only(left: 12.sp, right: 5.sp), + height: 72.sp, + width: 145.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.sp), + border: GradientBoxBorder( + gradient: AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl: bean['image'], + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit: BoxFit.cover), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only( + left: 8.sp, + ), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + bean['title'], + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + // "view_total" -> 21 + '${convertToTenThousand(bean['viewTotal'])}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + ], + ), + ), + ); + } +} diff --git a/circle_app/lib/app/quick/view.dart b/circle_app/lib/app/quick/view.dart index fcc7f53..cf4cb62 100644 --- a/circle_app/lib/app/quick/view.dart +++ b/circle_app/lib/app/quick/view.dart @@ -7,6 +7,7 @@ import 'package:get/get.dart'; import 'package:gradient_borders/box_borders/gradient_box_border.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import '../../common/Widgets/tag_widget.dart'; import '../../common/colors/app_color.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; @@ -302,12 +303,7 @@ class QuickPage extends StatelessWidget { ), ), const SizedBox(width: 6), - if (item.vip > 0) - Image( - image: AssetImage(getBaseImage(item.vip == 1 ? "vip" : 'year_vip')), - width: 44.sp, - height: 18.sp, - ), + UserTagWidget(item.mark!), ], ); } diff --git a/circle_app/lib/app/swiper/view.dart b/circle_app/lib/app/swiper/view.dart index 975766e..ad24b88 100644 --- a/circle_app/lib/app/swiper/view.dart +++ b/circle_app/lib/app/swiper/view.dart @@ -1,15 +1,19 @@ import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/common/colors/app_color.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:get/get.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:get/get_state_manager/src/simple/get_state.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import '../home/logic.dart'; import 'logic.dart'; import 'dart:ui' as ui; class SwiperPage extends StatefulWidget { @@ -23,6 +27,8 @@ class _SwiperPageState extends State { GlobalKey _globalKey = GlobalKey(); + var homeLogic = Get.find(); + @override Widget build(BuildContext context) { @@ -39,123 +45,247 @@ class _SwiperPageState extends State { }); - return Scaffold( - appBar: null, - backgroundColor: Colors.black87, - body: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: (() { - //点击任意地方都能关闭页面,并且不影响你的滑动查看 - Navigator.pop(context); - }), - child: Stack( + return Stack( + children: [ + Stack( children: [ + RepaintBoundary( + key: _globalKey, child: itemWidget(logic, logic.index, true)), Container( - child: Swiper( - controller: logic.swiperController, - index: logic.index, - loop: false, - - itemBuilder: (BuildContext context, int index) { - // if (logic.index == index) { - // return RepaintBoundary( - // key: _globalKey, - // child:itemWidget(logic,index)); - // } - return itemWidget(logic,index); - }, - - onIndexChanged: (int index) { - logic.index = index; - logic.update(); - }, - itemCount: logic.imgList.length, - pagination: const SwiperPagination( - builder: DotSwiperPaginationBuilder( - activeColor: Color(0xFFD14CFF), - color: Colors.white)), //下面的分页小点 - )), - // Positioned( - // bottom: Get.bottomBarHeight, - // right: 15.sp, - // child: InkWell( - // onTap: () { - // _saveLocalImage(); - // }, - // child: Container( - // alignment: Alignment.center, - // padding: EdgeInsets.all(5.sp), - // decoration: BoxDecoration( - // color: Colors.black.withOpacity(0.5), - // borderRadius: BorderRadius.circular(17.5.sp)), - // child: Icon( - // Icons.download, - // color: Colors.white, - // size: 25.sp, - // ), - // ), - // )) + width: Get.width, + height: Get.height, + color: Colors.black, + ), ], ), - ), + Scaffold( + appBar: null, + backgroundColor: Colors.black87, + body: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: (() { + //点击任意地方都能关闭页面,并且不影响你的滑动查看 + Navigator.pop(context); + }), + child: Stack( + children: [ + Container( + child: Swiper( + controller: logic.swiperController, + index: logic.index, + loop: false, + + itemBuilder: (BuildContext context, int index) { + // if (logic.index == index) { + // return RepaintBoundary( + // key: _globalKey, + // child:itemWidget(logic,index)); + // } + return itemWidget(logic,index,false); + }, + + onIndexChanged: (int index) { + logic.index = index; + logic.update(); + }, + itemCount: logic.imgList.length, + pagination: const SwiperPagination( + builder: DotSwiperPaginationBuilder( + activeColor: Color(0xFFD14CFF), + color: Colors.white)), //下面的分页小点 + )), + Positioned( + bottom: Get.bottomBarHeight, + right: 15.sp, + child: InkWell( + onTap: () { + _saveLocalImage(); + }, + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.all(5.sp), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.5), + borderRadius: BorderRadius.circular(17.5.sp)), + child: Icon( + Icons.download, + color: Colors.white, + size: 25.sp, + ), + ), + )) + ], + ), + ), + ), + ], ); }); } - itemWidget(SwiperLogic logic,int index) { - return Container( - width: Get.width, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Stack( - alignment: Alignment.center, - children: [ - - Container( - // color: Colors.red, - - child: CachedNetworkImage( - // progressIndicatorBuilder: (context,str,progress) { - // return Container(); - // }, - placeholder: (context,str) { - print(str + '进度'); - if (Get.arguments['index'] == index) { - return Container( - // color: Colors.red, + itemWidget(SwiperLogic logic,int index,bool isShow) { + String link = homeLogic.link + '#code=' + homeLogic.inviteCode; + return Stack( + children: [ + Container( + color: Colors.black, + width: double.infinity, + height: Get.height, + alignment: Alignment.center, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + Container( child: CachedNetworkImage( - imageUrl: logic.imgList[index].toString(), - - fit: BoxFit.cover, - width: Get.width, + imageUrl: logic.imgList[index], + fit: BoxFit.contain, ), - ); - } else { - return Container(); - } - }, - imageUrl: logic.imgList[index].toString().contains('?') ? logic.imgList[index].toString().split('?').first : logic.imgList[index].toString(), - fit: BoxFit.cover, - width: Get.width, - ), + ), + Positioned( + right: 10.sp, + bottom: 20.sp, + child: Container( + margin: EdgeInsets.only(top: Get.height * 0.45), + child: Text( + '微乐园APP', + style: + TextStyle(color: Colors.white, fontSize: 25.sp), + ), + )) + ], + ), + ], + ))), + if (isShow) + Positioned( + bottom: 0, + child: Container( + width: Get.width, + color: Colors.black, + height: 60.sp, + child: Row( + children: [ + Image.asset( + getBaseImage("ic_launcher"), + width: 50.sp, + height: 50.sp, + ), + SizedBox( + width: 10.sp, + ), + // Expanded( + // child: + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(top: 5.sp, bottom: 5.sp), + width: Get.width - 150.sp, + child: Text('微乐园APP-认识更多小众圈子的人', + style: TextStyle( + color: Colors.white, fontSize: 14.sp))), + Container( + alignment: Alignment.center, + padding: EdgeInsets.only(left: 10.sp, right: 10.sp), + height: 25.sp, + decoration: BoxDecoration( + // color: Color(0xFFDC5BFD), + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(12.5.sp)), + child: Text( + '专属邀请码:${homeLogic.inviteCode}', + style: + TextStyle(color: Colors.white, fontSize: 12.sp), + ), + ), + ], + ), + // ), + Expanded(child: Container()), + // SizedBox(width: 10.sp,), + Stack( + alignment: Alignment.center, + children: [ + Container( + color: Colors.white, + width: 50.sp, + height: 50.sp, + ), + QrImageView( + data: link, + padding: EdgeInsets.zero, + version: QrVersions.auto, + size: 45.sp, + gapless: false, + // backgroundColor: Colors.black, + ) + ], + ), + SizedBox( + width: 10.sp, + ), + ], ), - Positioned( - left: 10.sp, - bottom: 20.sp, - child: Container( - margin: - EdgeInsets.only(top: Get.height * 0.45), - child: Text( - '微乐园APP', - style: TextStyle( - color: Colors.white, fontSize: 25.sp), - ), - )) - ], - ) - ], - )); + )), + ], + ); + // return Container( + // width: Get.width, + // child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Stack( + // alignment: Alignment.center, + // children: [ + // + // Container( + // // color: Colors.red, + // + // child: CachedNetworkImage( + // // progressIndicatorBuilder: (context,str,progress) { + // // return Container(); + // // }, + // placeholder: (context,str) { + // print(str + '进度'); + // if (Get.arguments['index'] == index) { + // return Container( + // // color: Colors.red, + // child: CachedNetworkImage( + // imageUrl: logic.imgList[index].toString(), + // + // fit: BoxFit.cover, + // width: Get.width, + // ), + // ); + // } else { + // return Container(); + // } + // }, + // imageUrl: logic.imgList[index].toString().contains('?') ? logic.imgList[index].toString().split('?').first : logic.imgList[index].toString(), + // fit: BoxFit.cover, + // width: Get.width, + // ), + // ), + // Positioned( + // left: 10.sp, + // bottom: 20.sp, + // child: Container( + // margin: + // EdgeInsets.only(top: Get.height * 0.45), + // child: Text( + // '微乐园APP', + // style: TextStyle( + // color: Colors.white, fontSize: 25.sp), + // ), + // )) + // ], + // ) + // ], + // )); } _saveLocalImage() async { @@ -166,9 +296,11 @@ class _SwiperPageState extends State { ByteData? byteData = await (image.toByteData(format: ui.ImageByteFormat.png)); if (byteData != null) { + SmartDialog.showLoading(msg: '正在保存...'); final result = await ImageGallerySaver.saveImage(byteData.buffer.asUint8List()); print(result); + SmartDialog.dismiss(); // isSuccess if (result['isSuccess']) { showOKToast('保存成功'); diff --git a/circle_app/lib/app/userinfo/logic.dart b/circle_app/lib/app/userinfo/logic.dart index 38fd170..78b9aa6 100644 --- a/circle_app/lib/app/userinfo/logic.dart +++ b/circle_app/lib/app/userinfo/logic.dart @@ -420,6 +420,7 @@ class UserBean { int vip; int gender; int role; + int mark; int orientation; List interests; List orientations; @@ -443,6 +444,7 @@ class UserBean { required this.gender, required this.hide_wx_num, required this.orientations, + required this.mark, required this.role, required this.orientation, required this.interests, @@ -460,6 +462,7 @@ class UserBean { hide_wx_num: json['hide_wx_num'] ?? 0, orientations: json['orientations'] ?? [], wx_num: json['wx_num'] ?? '', + mark: json['mark'] ?? 0, nickname: json['nickname'], avatar: json['avatar'], birthday: json['birthday'], diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index 403626c..acc3469 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -3,6 +3,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/common/Widgets/base_tip_widget.dart'; +import 'package:circle_app/common/Widgets/user_share.dart'; import 'package:circle_app/common/colors/app_color.dart'; import 'package:circle_app/common/const.dart'; import 'package:circle_app/main.dart'; @@ -12,6 +13,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../common/Widgets/tag_widget.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; import '../../util/eventBus.dart'; @@ -486,9 +488,7 @@ class MyTabbedScreenState extends State final interests = userInfoBean?.interests ?? []; return Container( - // color: Colors.red, width: Get.width, - // height: Get.height, padding: EdgeInsets.symmetric(vertical: 14.sp), child: Column( children: [ @@ -1073,13 +1073,8 @@ class MyTabbedScreenState extends State ), ), const SizedBox(width: 6), - if (controller.isVip > 0) - Image( - image: AssetImage( - getBaseImage(controller.isVip == 1 ? "vip" : 'year_vip')), - width: 44.sp, - height: 18.sp, - ), + if ((controller.userInfoBean?.mark ?? 0) > 0) + UserTagWidget(controller.userInfoBean!.mark!), ], ); } @@ -1235,6 +1230,29 @@ class MyTabbedScreenState extends State child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + Get.bottomSheet(UserShare(userImgUrl: logic.userInfoBean!.avatar!, userNIckName: ''),isScrollControlled:true); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMsgImage("msg_share")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: const Text( + "分享", + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), GestureDetector( onTap: () { Navigator.pop(context); diff --git a/circle_app/lib/common/Widgets/tag_widget.dart b/circle_app/lib/common/Widgets/tag_widget.dart new file mode 100644 index 0000000..d3504e1 --- /dev/null +++ b/circle_app/lib/common/Widgets/tag_widget.dart @@ -0,0 +1,41 @@ +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../router/app_routers.dart'; + +class UserTagWidget extends StatelessWidget { + int type; + // TODO: add state variables, methods and constructor params + UserTagWidget(this.type); + // NON(0, "null或0无标识"), + // BACKER(1, "金主"), + // GOOD(2, "Good"), + // YEAR_PARTNER(3, "年合伙人"), + // PARTNER(4, "合伙人"), + // NEW_USER(5, "新人"), +List tagList = '""、金主、Good、年VIP、VIP、新人'.split('、'); + @override + Widget build(BuildContext context) { + // TODO: add widget build method + if (type == 0 || type >= tagList.length + 1) { + return Container(); + } + return GestureDetector( + onTap: () { + }, + child: Container( + alignment: Alignment.center, + height: 14.sp, + padding: EdgeInsets.only(left: 8.sp,right: 8.sp), + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(7.sp) + ), + child: Text(tagList[type],style: TextStyle(color: const Color.fromRGBO(19, 33, 54, 1),fontWeight: FontWeight.bold,fontSize: 11.sp),), + ), + ); + } + +} diff --git a/circle_app/lib/common/Widgets/user_share.dart b/circle_app/lib/common/Widgets/user_share.dart new file mode 100644 index 0000000..82e2ee9 --- /dev/null +++ b/circle_app/lib/common/Widgets/user_share.dart @@ -0,0 +1,481 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:cached_network_image/cached_network_image.dart'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'dart:ui' as ui; +import 'package:fluwx/fluwx.dart' as fluwx; +import 'package:path_provider/path_provider.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + +import '../../app/home/logic.dart'; +import '../../util/util.dart'; +import '../colors/app_color.dart'; + +class UserShare extends StatefulWidget { + String userImgUrl; + String userNIckName; + + UserShare({super.key,required this.userImgUrl,required this.userNIckName}); + @override + _UserShareState createState() => new _UserShareState(); + +} + +class _UserShareState extends State { + // TODO: add state variables and methods + HomeLogic logic = Get.find(); + + GlobalKey _globalKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Scaffold( + backgroundColor: Colors.transparent, + body: Container( + child: Column( + children: [ + Expanded(child: Container()), + Container( + width: Get.width - 40.sp, + // height: Get.height - Get.bottomBarHeight - 164.sp - 10.sp, + child:SingleChildScrollView( + child: RepaintBoundary( + key: _globalKey, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getCircleImage("open_vip_bg")), + fit: BoxFit.fill, + ), + ), + child: Column( + children: [ + Container( + width: Get.width, + height: 65.sp, + margin: EdgeInsets.only(left: 15.sp, top: 20.sp,right: 15.sp), + child: Row( + children: [ + Center( + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: 47.sp, + height: 47.sp, + decoration: const BoxDecoration( + shape: BoxShape.circle, + + ), + ), + SizedBox( + width: 46.sp, + height: 46.sp, + child: _buildAvatar1(logic), + ) + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 10.sp), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + _buildNameRow(logic), + SizedBox(height: 10.sp), + _buildInfoRow(logic), + ], + ), + ), + ), + Image.asset( + getBaseImage("ic_launcher"), + width: 60.sp, + height: 60.sp, + ) + ], + ), + ), + Container( + height: 300.sp, + width: Get.width, + margin: EdgeInsets.only(left: 10.sp,right: 10.sp,top: 10.sp,bottom: 5.sp), + + child:ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: Image.network(widget.userImgUrl,fit: BoxFit.cover,) + ), + ), + + Container( + // height: 90.sp, + // color: Color(0xFF334141), + alignment: Alignment.center, + // color: Colors.yellow, + // width: Get.width-40.sp, + margin: EdgeInsets.only(bottom: 15.sp,top: 10.sp), + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Row( + + children: [ + Expanded( + child: Container( + // color: Colors.red, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + // color: Colors.blue, + child: Row( + children: [ + Text( + '专属邀请码', + style: TextStyle( + color: Colors.white, + fontSize: 18.sp), + ), + SizedBox( + width: 8.sp, + ), + Container( + alignment: Alignment.center, + padding: EdgeInsets.only( + left: 10.sp, right: 10.sp), + height: 25.sp, + decoration: BoxDecoration( + // color: Color(0xFFDC5BFD), + gradient: + const LinearGradient( + colors: [ + Color(0xFFD263FB), + Color(0xFFD263FB) + ], + begin: + Alignment.centerLeft, + end: + Alignment.centerRight, + ), + borderRadius: + BorderRadius.circular( + 12.5.sp)), + child: Text( + logic.inviteCode, + style: TextStyle( + color: Colors.white, + fontSize: 12.sp), + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.sp), + width: Get.width - 200.sp, + child: Text( + '扫码或长按识别下载APP,认识更多小众圈子里的人,给生活带来更多乐趣~', + style: TextStyle( + color: Colors.white, + fontSize: 15.sp)), + ) + ], + ), + ), + ), + // Image.asset(getBaseImage("ic_launcher"),width: 80.sp,height: 80.sp,) + Stack( + alignment: Alignment.center, + children: [ + Container( + color: Colors.white, + width: 90.sp, + height: 90.sp, + ), + QrImageView( + data: logic.link + '#code=${logic.inviteCode}', + padding: EdgeInsets.zero, + version: QrVersions.auto, + size: 80.sp, + gapless: false, + // backgroundColor: Colors.black, + ) + ], + ) + ], + ), + ) + ], + ), + )) + ), + ), + SafeArea( + top: false, + bottom: false, + child: Container( + height: 164.sp, + width: Get.width, + color: Color(0xFF292247), + child: Column( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only( + top: 15.sp, left: 15.sp, right: 15.sp), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + shareAction('wx', '微信', () { + shareWxData(1); + }), + shareAction('wxq', '朋友圈', () { + shareWxData(2); + }), + shareAction('save', '复制邀请链接', () { + copyInviteText(logic.model!.nickname!); + }), + // shareAction('wb', '复制链接', () { + // copyInviteText(logic.name); + // }), + + shareAction('hb', '保存邀请海报', () { + _saveLocalImage(); + }), + ], + ), + )), + Container( + height: 1.sp, + color: Color(0x33FFFFFF), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.back(); + }, + child: Container( + height: 67.sp, + alignment: Alignment.center, + child: Text( + '取消', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + ), + ), + ) + ], + ), + )) + ], + ), + ), + ); + } + + Widget _buildAvatar1(HomeLogic logic) { + return ClipOval( + child: GestureDetector( + onTap: () { + if (logic.model != null) { + var imgList = []; + imgList.add(logic.model!.avatar!); + // Get.toNamed(AppRoutes.Swiper,arguments:imgList); + // Get.toNamed(AppRoutes.Swiper, arguments: { + // 'imaglist': imgList, + // 'index': 0 + // }); + } + }, + child: logic.model == null + ? SizedBox( + width: 63.sp, + height: 63.sp, + ) + : CachedNetworkImage( + fit: BoxFit.cover, + placeholder: null, + imageUrl: logic.model!.avatar!, + width: 63.sp, + height: 63.sp, + ), + ), + ); + } + + Widget _buildNameRow(HomeLogic logic) { + int gender = logic.model!.gender!; + int role = logic.model!.role!; + int age = logic.model!.age!; + int orientation = logic.model!.orientation!; + + String ageMsg = getAgeCOntent(gender, age, role, orientation); + return Container( + margin: EdgeInsets.only(top: 6.sp), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + logic.model!.nickname!, + style: TextStyle( + color: const Color.fromRGBO(247, 250, 250, 1.0), + fontSize: 16.sp, + ), + ), + SizedBox( + width: 4.sp, + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color.fromRGBO(141, 255, 248, 1.0), + Color.fromRGBO(181, 211, 255, 1.0), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), + child: Text( + ageMsg, + style: TextStyle( + color: Colors.black, + fontSize: 10.sp, + ), + ), + ), + ], + ), + ); + } + + Widget _buildInfoRow(HomeLogic logic) { + return Row( + children: [ + Text('邀请您加入', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + )), + Text('【微乐园APP】', + style: TextStyle( + color: AppColor.mainColor, + fontSize: 14.sp, + fontWeight: FontWeight.bold + )), + ], + ); + } + + shareAction(String img, String name, GestureTapCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + child: Column( + children: [ + Image.asset( + getMineImage(img), + width: 40.sp, + ), + SizedBox( + height: 10.sp, + ), + Text( + name, + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ) + ], + ), + ), + ); + } + + _saveLocalImage() async { + RenderRepaintBoundary boundary = + _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio); + ByteData? byteData = + await (image.toByteData(format: ui.ImageByteFormat.png)); + if (byteData != null) { + final result = + await ImageGallerySaver.saveImage(byteData.buffer.asUint8List()); + print(result); + // isSuccess + if (result['isSuccess']) { + showOKToast('保存成功'); + } else { + showOKToast('保存失败,请检查相册权限是否开启'); + } + } + } + + copyInviteText( + String username, + ) { + String linkStr = logic.link.replaceAll('https://', ''); + + Clipboard.setData(ClipboardData( + text: '【${username}】邀请你加入“微乐园”,邀请码为${logic.inviteCode},点击进入${logic.link}' + '这是一款专为各种特色小众圈子爱好者打造的交友平台,资质齐全,安全正规。' + '在这里,能看到很多没听说过的圈子,也能发现很多为数不多的真实情怀,还能见证小众亚文化在生活方式上的新体验。真实、安全、私密、走心,我和很多圈友都在玩哦~')); + showOKToast('您已成功复制分享链接,前往对应平台粘贴发送即可~'); + } + /** + * 分享图片到微信, + * file=本地路径 + * url=网络地址 + * asset=内置在app的资源图片 + * scene=分享场景,1好友会话,2朋友圈,3收藏 + */ + void shareWxData(int scene) async { + + SmartDialog.showLoading(msg:'正在生成分享图片...'); + RenderRepaintBoundary boundary = + _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio); + ByteData? byteData = + await (image.toByteData(format: ui.ImageByteFormat.png)); + String filePath = ''; + if (byteData != null) { + Uint8List pngBytes = byteData!.buffer.asUint8List(); + Directory directory = await getApplicationDocumentsDirectory(); + filePath = '${directory.path}/widget_image.png'; + File imageFile = File(filePath); + imageFile.writeAsBytesSync(pngBytes); + } + SmartDialog.dismiss(); + fluwx.WeChatScene wxScene = fluwx.WeChatScene.SESSION; + if (scene == 2) { + wxScene = fluwx.WeChatScene.TIMELINE; + } + fluwx.WeChatShareImageModel? model; + + if (filePath.isNotEmpty) { + model = fluwx.WeChatShareImageModel(fluwx.WeChatImage.file(File(filePath)), + title: '', description: '', scene: wxScene); + } + if (model != null) { + fluwx.shareToWeChat(model!); + } + + } +} diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index e690812..ab99cde 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -13,6 +13,7 @@ import 'package:circle_app/util/PaymentUtils.dart'; import 'package:circle_app/util/SharedPreferencesHelper.dart'; import 'package:circle_app/util/device.dart'; import 'package:circle_app/util/util.dart'; +import 'package:device_info/device_info.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bugly/flutter_bugly.dart'; @@ -44,6 +45,7 @@ final TUIChatSeparateViewModel chatSeparateViewModel = OverlayEntry? mainOverlayEntry; void main() { + checkAndExitIfEmulator(); // setCustomErrorWidget(); FlutterBugly.postCatchedException(() async { // 如果需要 ensureInitialized,请在这里运行。 @@ -68,6 +70,17 @@ void main() { } } + +Future checkAndExitIfEmulator() async { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + if (!androidInfo.isPhysicalDevice) { + exit(0); + } + } +} + setCustomErrorWidget() { ErrorWidget.builder = (FlutterErrorDetails details) { print(details.toString()); diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index 0b854a2..5482d7d 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -4,7 +4,7 @@ class Api { static const baseUrl2 = 'https://wlybiz.cdtszn.net/zuul-service/'; static const baseUrl1 = 'https://wlybiz.leyuan666.com/zuul-service/'; - static const baseUrl = 'http://192.168.3.55:2000/'; + static const baseUrl = 'http://192.168.3.5:2000/'; // 获取验证码 diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index e3a8594..09d047f 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -42,9 +42,9 @@ class DioManager { // baseUrl2 baseUrl: - // Api.baseUrl, + Api.baseUrl, - type == 1 ? Api.baseUrl2 : Api.baseUrl1, + // type == 1 ? Api.baseUrl2 : Api.baseUrl1, // 连接服务器超时时间,单位是毫秒 connectTimeout: const Duration(seconds: 30), // 接收数据的最长时限 diff --git a/circle_app/lib/util/SharedPreferencesHelper.dart b/circle_app/lib/util/SharedPreferencesHelper.dart index 79fee79..c6b8763 100644 --- a/circle_app/lib/util/SharedPreferencesHelper.dart +++ b/circle_app/lib/util/SharedPreferencesHelper.dart @@ -14,7 +14,7 @@ class SharedPreferencesHelper { static const NAME = 'name'; static const LOGINPHONE = 'loginPhone'; - + static const PWD = 'pwd'; static const AGREEMENT = 'agreement'; static const String firstLogin = 'firstlogin'; diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index 62e4995..44c5c38 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -87,14 +87,6 @@ showOKToast(String msg) { textStyle: const TextStyle(fontSize: 16.0), // animationBuilder: const Miui10AnimBuilder(), ); - // Fluttertoast.showToast( - // msg: msg, - // toastLength: Toast.LENGTH_SHORT, - // gravity: ToastGravity.CENTER, - // timeInSecForIosWeb: 1, - // backgroundColor: Colors.black54, - // textColor: Colors.white, - // fontSize: 16.0); } loaddingWidget(bool isMore) { @@ -183,9 +175,12 @@ pushLoginPage() async { SharedPreferencesHelper.getInstance().then((sharedPreferences) { String loginPhone = sharedPreferences.getString(SharedPreferencesHelper.LOGINPHONE) ?? ""; + String pwd = + sharedPreferences.getString(SharedPreferencesHelper.PWD) ?? ""; print(loginPhone); sharedPreferences.clear(); sharedPreferences.setString(SharedPreferencesHelper.LOGINPHONE, loginPhone); + sharedPreferences.setString(SharedPreferencesHelper.PWD, pwd); sharedPreferences.setBool(SharedPreferencesHelper.AGREEMENT, true); sharedPreferences.setString(SharedPreferencesHelper.firstLogin, '1'); }); @@ -393,6 +388,15 @@ void navigateToUserAgreement() { }); } +//跳转到如何上精选 +void navigateToQueen() { + Get.toNamed(AppRoutes.WebViewActivity, arguments: { + 'title': "如何上精选", + "url": 'https://iquanpai.com/app-h5/4_184.html' + }); +} + + //跳转到隐私政策 void navigateToPrivacyPolicy() { Get.toNamed(AppRoutes.WebViewActivity, arguments: { diff --git a/circle_app/pubspec.lock b/circle_app/pubspec.lock index 576c8fc..9510a3a 100644 --- a/circle_app/pubspec.lock +++ b/circle_app/pubspec.lock @@ -622,14 +622,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.3" - flutter_install_app: - dependency: "direct main" - description: - name: flutter_install_app - sha256: "9b117006d17c900e671c26bcbc9b15c7b8efd15d6f9b4442ad5d576de20fab53" - url: "https://pub.dev" - source: hosted - version: "1.3.0" flutter_intl: dependency: "direct main" description: diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index becba80..f92f29c 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -90,7 +90,7 @@ dependencies: fluwx: ^3.8.1+1 event_bus: ^2.0.0 #安装apk - flutter_install_app: 1.3.0 +# flutter_install_app: 1.3.0 #闪屏页 flutter_native_splash: 2.2.16 #腾讯离线推送