From 55c87008da3703262bf56e56dd475e49d7517c9a Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 12 Mar 2025 16:43:43 +0800 Subject: [PATCH] =?UTF-8?q?2.4.7=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- circle_app/android/build.gradle | 2 +- circle_app/data/img/mine/bubble_icon.png | Bin 0 -> 107060 bytes circle_app/data/img/mine/hand_icon.png | Bin 0 -> 2303 bytes circle_app/lib/circle_app/bill/view.dart | 42 +- .../tim_uikit_text_field_layout/narrow.dart | 4 +- circle_app/lib/circle_app/circle/logic.dart | 15 +- circle_app/lib/circle_app/circle/state.dart | 4 + .../circle_app/circle/widgets/discover.dart | 5 +- .../circle/widgets/info_list_view.dart | 399 +++- .../circle_app/circle/widgets/like_view.dart | 447 +++- .../circle/widgets/play_video_view.dart | 113 +- .../circle_app/circle/widgets/video_item.dart | 21 +- .../lib/circle_app/circle_list/logic.dart | 97 +- .../lib/circle_app/circle_list/view.dart | 24 +- .../circle_list/widgets/all_circle_item.dart | 400 +++- .../widgets/apply_for_an_agent_dialog.dart | 188 ++ .../widgets/right_circle_iten.dart | 1939 ++++++++++------- circle_app/lib/circle_app/help/view.dart | 2 +- circle_app/lib/circle_app/home/logic.dart | 17 +- circle_app/lib/circle_app/home/view.dart | 7 +- circle_app/lib/circle_app/invite/view.dart | 357 +-- .../lib/circle_app/login/login/logic.dart | 2 +- .../lib/circle_app/minefragment/logic.dart | 11 +- .../minefragment/mine_func_item.dart | 2 +- .../lib/circle_app/minefragment/view.dart | 180 +- circle_app/lib/circle_app/msg/logic.dart | 5 + .../circle_app/msg/sys_notify_list/view.dart | 6 +- circle_app/lib/circle_app/quick/logic.dart | 2 +- .../widgets/online_recommand_dialog.dart | 3 +- .../lib/commons/widgets/unlock_wx_tip.dart | 19 +- .../lib/commons/widgets/wx_edit_dialog.dart | 281 +-- circle_app/lib/net/api.dart | 22 +- circle_app/lib/net/dio_manager.dart | 104 +- .../lib/utils/SharedPreferencesHelper.dart | 20 + circle_app/lib/utils/util.dart | 238 +- circle_app/lib/view/notice.dart | 2 +- 37 files changed, 3375 insertions(+), 1609 deletions(-) create mode 100644 circle_app/data/img/mine/bubble_icon.png create mode 100644 circle_app/data/img/mine/hand_icon.png create mode 100644 circle_app/lib/circle_app/circle_list/widgets/apply_for_an_agent_dialog.dart diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 7ca6218..540d074 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -71,8 +71,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 89 - versionName "2.4.4" + versionCode 92 + versionName "2.4.7" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/android/build.gradle b/circle_app/android/build.gradle index 6616767..5331b8d 100644 --- a/circle_app/android/build.gradle +++ b/circle_app/android/build.gradle @@ -26,7 +26,7 @@ allprojects { maven { url "https://storage.googleapis.com/download.flutter.io" } maven { url "https://jitpack.io" } maven { url 'https://mvn.getui.com/nexus/content/repositories/releases' } - maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" } +// maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" } maven { url 'https://repo1.maven.org/maven2/' } maven {url 'https://developer.huawei.com/repo/'} maven { url 'https://developer.hihonor.com/repo/' } diff --git a/circle_app/data/img/mine/bubble_icon.png b/circle_app/data/img/mine/bubble_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf5d3caf83148a3675fd37e2fc5a751ff9ed2de GIT binary patch literal 107060 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 literal 0 HcmV?d00001 diff --git a/circle_app/data/img/mine/hand_icon.png b/circle_app/data/img/mine/hand_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..12a2b3169d01f2df1c5b30ddef30d83a28d75939 GIT binary patch literal 2303 zcmbtW`8$;R8~(h;3>lL(bFx&Xrjo)~B4bM0D$1=K-<59 z@P8$XTj?KjBFt6*3fpgQ3;3@z#{rP7cckt1j6D3+FG9riQ2nhHJ-sHnvOr1uzWO#h z9TVP~6LvfnGi^gDBf2@&d*lAQ%DQ4b6JK)Ogu?zLMy6t6v)NRorT&M-rNM&R#rg!m@LPvI01u?Aln??` zPC$M)kr2C6+2^HxU{QBqg`HW0qyYgQZs5ddT-6}Udu|2121Vp6(8R$JN9N7~wZ(p_ z`?E9<2MpGsxg^7`uoNc?E)@vpvc5W7uSHRLd4I*)Nb?X(=tiW2mPjhIr}IJSwx-Dd zuv(_`?WbsNNhUs{^r5ar5pkGod4k! z`!{;cnZ22CHBQ5bZ$3~=pRP4%CW4bzi-9*vN2U*vNhQbM7wQ9X%-Fb#_y$IhBT1I6 z2-ZKj7BG$pu5()mg214(%WR^&TKb8`zIg~f9>%PgqB?3=bTlIYB-=X~#3f)Lh3){? zzunBYT=z>8JxrQyoMy!W_|PJ*M56bZ>WIDbn}BW~%_ufXR}#?enc5K`H^kUt0{;0X zlzB<`7A%_`n2U>#=nGQHk3et5xS`d6ekR)oG~~>Ss=Ai0AeIHm>1E*dMv}a%np-0< zc%6KT=?fFEphjc|0cmchAL&g6ExKdiCXUMEG*zLUF-t}&*yT|cSISp8}NnO z!A!1)pY{ORTy#SAOlMHx^pARh6ci#v-tj2 zDdaU}q)nW)!tEi{4LU}?mg7Ta-Dmok249U%u-3^&V_iVVS!{4?U0ZCse!+4ZpKM9~ zU>r4MwHX*6)dGJq-PTE8~2RsY;T+!-ux{o|<)>FG|U$n>td zbMdKZwscOR)86I4;OT&Z3|x`EokG7o7X71*8De&c7?>RJLXn}6^fPB^kir)7>Z*r;%G}*)s0N3oW(?HGW{i!pEw$*B@D1%j_X+0trq3R6)uh k;9q with SingleTickerProviderStateMixin { ), ), ) - : noResultWidget(); + : noResultWidget(tip:type == 2 ? "正在等待被填充~" : '',action: type == 3 ? '申请圈子代理人快速增加收入' : type == 1 ? '首充可送小票/经验值/会员' : '',callBack: () async { + if (type == 3) { + Get.until((route) { + return route.isFirst; + }); + var logic = Get.find(); + logic.updateIndex(1); + + LikeLogic likeLogic; + if (Get.isRegistered()) { + likeLogic = Get.find(); + if (likeLogic.mycircle.lists.isEmpty) { + await likeLogic.loadMyCircleData(); + } + if (likeLogic.mycircle.lists.isNotEmpty) { + likeLogic.currentIndex = 0; + + likeLogic.update(); + } + } else { + Future.delayed(Duration(milliseconds: 2500),() async { + likeLogic = Get.find(); + if (likeLogic.mycircle.lists.isEmpty) { + await likeLogic.loadMyCircleData(); + } + if (likeLogic.mycircle.lists.isNotEmpty) { + likeLogic.currentIndex = 0; + likeLogic.update(); + } + }); + } + + } else if (type == 1){ + showRechargeScreenDialog(''); + } + }); } onRefresh(int type, int page) async { @@ -290,7 +328,7 @@ class ListItemWidget extends StatelessWidget { type == 2 ? '-' + item.amount.toString() + '小票' : '+' + - '${type == 3 ? (item.amount * 0.01).toStringAsFixed(2) + '元' : item.amount.toString() + '小票'}', + '${type == 3 ? (item.amount).toString() + '小票' : item.amount.toString() + '小票'}', style: TextStyle( color: const Color(0xffefd84e), fontSize: 14.0.sp, diff --git a/circle_app/lib/circle_app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart b/circle_app/lib/circle_app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart index 0d63c33..c82e267 100644 --- a/circle_app/lib/circle_app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart +++ b/circle_app/lib/circle_app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart @@ -1251,7 +1251,7 @@ class _TIMTextFieldLayoutNarrowState var status = await checkCameraStatus(); if (!status) return; } else { - await requestStoragePermission(); + // await requestStoragePermission(); } XFile? pickedFile; @@ -1366,7 +1366,7 @@ class _TIMTextFieldLayoutNarrowState if (!isOK) { return; } - await requestStoragePermission(); + // await requestStoragePermission(); var status = await checkCameraStatus(); if (!status) return; try { diff --git a/circle_app/lib/circle_app/circle/logic.dart b/circle_app/lib/circle_app/circle/logic.dart index 9b5f884..23f42ba 100644 --- a/circle_app/lib/circle_app/circle/logic.dart +++ b/circle_app/lib/circle_app/circle/logic.dart @@ -22,6 +22,7 @@ import '../../commons/config.dart'; import '../../commons/widgets/refresh_list_manager.dart'; import '../../net/api.dart'; import '../../net/dio_manager.dart'; +import '../../utils/SharedPreferencesHelper.dart'; import '../../utils/eventBus.dart'; import '../../utils/newbie_guide_tip.dart'; import '../../utils/qiniu.dart'; @@ -219,12 +220,12 @@ final ScrollController nearScrollController = ScrollController(); loadCircleListData() async { var data = await DioManager.instance.get( - url: Api.getCircleInterests, params: {"page": page, 'page_size': 20}); + url: Api.getCircleInterests, params: {"page": page, 'page_size': 10}); var bean = BaseResponse.fromJson( data, (data) => InterestsBean.fromJson(data)); if (bean.data is InterestsBean && bean.isSuccess()) { circle = bean.data!; - if (circle.lists.length < 20) { + if (circle.lists.isEmpty) { isMore = false; } @@ -646,8 +647,14 @@ final ScrollController nearScrollController = ScrollController(); position = await getCurrentPosition(); await getCurrentCity(); } else if (isShowLocationDialogEd == false && isShowLocationDialog == false) { - isShowLocationDialogEd = true; - update(); + + SharedPreferencesHelper helper = + await SharedPreferencesHelper.getInstance(); + if (!(await helper.isShowNearLocation())) { + isShowLocationDialogEd = true; + update(); + } + } } } diff --git a/circle_app/lib/circle_app/circle/state.dart b/circle_app/lib/circle_app/circle/state.dart index ae2dfa5..fa33257 100644 --- a/circle_app/lib/circle_app/circle/state.dart +++ b/circle_app/lib/circle_app/circle/state.dart @@ -26,6 +26,8 @@ class Lists { int? userTop; String? create_time; String? at; + Map? topInteractType; + int? isInteract; Lists( {this.album, this.chat, this.content, this.id, this.isQueen, this.user}); @@ -46,10 +48,12 @@ class Lists { : null; showType = json['showType']; interest = json['interest'] ?? {}; + topInteractType = json['topInteractType'] ?? {}; create_time = json['createTime'] ?? json['create_time']; // "createTime" -> "2024-12-04 22:00" isQueen = json['is_queen']; userTop = json['userTop'] ?? 0; + isInteract = json['interactedType'] ?? 0; user = json['user'] != null ? new User.fromJson(json['user']) : null; } diff --git a/circle_app/lib/circle_app/circle/widgets/discover.dart b/circle_app/lib/circle_app/circle/widgets/discover.dart index 683a11d..eb6b9d0 100644 --- a/circle_app/lib/circle_app/circle/widgets/discover.dart +++ b/circle_app/lib/circle_app/circle/widgets/discover.dart @@ -417,11 +417,12 @@ class _DiscoverState extends State loadData(); } - _onLoading() { + _onLoading() async { if (isLoadMore) return; // if (refreshController.footerStatus == LoadStatus.loading) return; isLoadMore = true; - loadData(); + await loadData(); + isLoadMore = false; } @override diff --git a/circle_app/lib/circle_app/circle/widgets/info_list_view.dart b/circle_app/lib/circle_app/circle/widgets/info_list_view.dart index 567575a..faea304 100644 --- a/circle_app/lib/circle_app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/circle_app/circle/widgets/info_list_view.dart @@ -34,6 +34,7 @@ import '../../../utils/cache_img.dart'; import '../../../utils/eventBus.dart'; import '../../circle_list/logic.dart'; import '../../circle_list/widgets/hug_tip.dart'; +import '../../circle_list/widgets/right_circle_iten.dart'; class InfoListView extends StatefulWidget { var logic; @@ -59,11 +60,20 @@ class InfoListViewState extends State with AutomaticKeepAliveClien bool isLoad = true; bool callOutMore = true; + bool isShowEmoji = false; var circleId = ''; List lists = []; double widgetWidth = 0.0; Map interestAgentMap = {}; + + List emojis = [ + "❤️", "🪢", "⛓️", "🕯️", "🔐", "🔔", "⭕️", "📏", "🪡", "🎭", + "👙", "👅", "🦶", "🧎", "⚔️", "🍌", "🦋", "🌼", "👏", "🤟", + "🙏", "🦴", "🐶", "👿", "👼", "👻", "🌹", "💌", "😘", "😍", + "🫣", "😂", "🤐", "😱", "🫥" +]; + @override void dispose() { // TODO: implement dispose @@ -262,7 +272,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien } Get.toNamed(Routes.Chat, arguments: con); } else if (data['code'] == 32104) { - showReportDialog(Get.context!, data['msg']); + showReportDialog(Get.context!, circleId); } } @@ -335,7 +345,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien bean.chat!.count = bean.chat!.count! + 1; widget.logic.update(); } - } } @@ -1015,6 +1024,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ///至尊喊话 vipDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, style: TextStyle(color: Colors.white, fontSize: 14.sp), @@ -1343,50 +1353,99 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ); }), ), - Container( - height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only(top: picHeight > 0 ? 5.sp : 5.sp,bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000) - ), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), - ) - : Container(), - SizedBox( - width: 4.sp, - ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), fontSize: 14.sp), - )), - GestureDetector( - onTap: () { - pushMsgPage(lists, widget.bean.id.toString(),); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 2.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + widget.bean.id.toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 50.sp, + ), + ) + ], ), - ) - ], - ), + ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 10.sp : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], ) ], ), @@ -1396,6 +1455,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ///普通图文喊话 normalDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, style: TextStyle(color: Colors.white, fontSize: 14.sp), @@ -1721,51 +1781,99 @@ class InfoListViewState extends State with AutomaticKeepAliveClien ); })) : Container(), - Container( - height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp,), - margin: EdgeInsets.only(top: picHeight > 0 ? 5.sp : 10.sp,bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), - ) - : Container(), - SizedBox( - width: 4.sp, + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 2.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + widget.bean.id.toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 50.sp, + ), + ) + ], + ), ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), fontSize: 14.sp), - )), - GestureDetector( - onTap: () async{ - pushMsgPage(lists, widget.bean.id.toString()); + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } - // }); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, - )) - ], - ), - ), + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 10.sp : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], + ) ], ), @@ -1780,6 +1888,121 @@ class InfoListViewState extends State with AutomaticKeepAliveClien )); } + OverlayEntry? _overlayEntry; + + void _showEmojiPicker(Lists list,int id,BuildContext context, Offset position) { + if (isShowEmoji) return; + isShowEmoji = true; + _overlayEntry = OverlayEntry( + builder: (context) => Stack( + children: [ + // 遮罩层,点击关闭 + Positioned.fill( + child: GestureDetector( + onTap: () { + _removeOverlay(); + isShowEmoji = false; + }, + child: Container( + color: Colors.black.withOpacity(0.3), + ), + ), + ), + // 表情选择器 + Positioned( + left: position.dx - 190.w, + top: position.dy - 60.sp, + child: Material( + color: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 气泡框 + Container( + width: 200.w, // 设置最大宽度,超出才会滚动 + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black26, + blurRadius: 10, + spreadRadius: 2, + ), + ], + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: emojis.map((emoji) => Padding( + padding: EdgeInsets.symmetric(horizontal: 4), + child: _emojiButton(emoji,id,list), + )).toList(), + ),), + ), + // 底部倒三角形 + ], + ), + )), + Positioned( + left: position.dx - 12.w, + top: position.dy - 15, + child: CustomPaint( + size: Size(20, 10), + painter: TrianglePainter(), + ), + ) + ], + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + + } + + Widget _emojiButton(String emoji,int id,Lists list) { + return GestureDetector( + onTap: () async { + print("选择了表情: $emoji"); + _removeOverlay(); + isShowEmoji = false; + + int index = emojis.indexOf(emoji) + 1; + var result = await DioManager.instance.post(url: Api.interactEmoji,params: { + "calloutId": id, + "type": index + }); + if (result['code'] == 200) { + var data = await DioManager.instance.get(url: Api.signCalloutDetail,params: { + 'id':id, + }); + if (data['code'] == 200) { + Lists bean =Lists.fromJson(data['data']); + index = lists.indexOf(list); + lists[index] = bean; + if (mounted) { + setState(() { + + }); + } + } + } + }, + child: Text( + emoji, + style: TextStyle(fontSize: 25), + ), + ); + } + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + } + + circleInfoItem() { return ClipRRect( borderRadius: BorderRadius.circular( diff --git a/circle_app/lib/circle_app/circle/widgets/like_view.dart b/circle_app/lib/circle_app/circle/widgets/like_view.dart index 4f63ed7..cb02cf9 100644 --- a/circle_app/lib/circle_app/circle/widgets/like_view.dart +++ b/circle_app/lib/circle_app/circle/widgets/like_view.dart @@ -33,6 +33,7 @@ import '../../../utils/cache_img.dart'; import '../../../utils/time_format.dart'; import '../../circle_list/logic.dart'; import '../../circle_list/view.dart'; +import '../../circle_list/widgets/right_circle_iten.dart'; import '../../msg/recommend_circle_friend_item.dart'; import '../../world_call_out/view.dart'; import 'package:intl/intl.dart'; @@ -77,6 +78,14 @@ class _LikeViewState extends State List likelist = []; + List emojis = [ + "❤️", "🪢", "⛓️", "🕯️", "🔐", "🔔", "⭕️", "📏", "🪡", "🎭", + "👙", "👅", "🦶", "🧎", "⚔️", "🍌", "🦋", "🌼", "👏", "🤟", + "🙏", "🦴", "🐶", "👿", "👼", "👻", "🌹", "💌", "😘", "😍", + "🫣", "😂", "🤐", "😱", "🫥" +]; OverlayEntry? _overlayEntry; + bool isShowEmoji = false; + @override void dispose() { // TODO: implement dispose @@ -844,6 +853,7 @@ class _LikeViewState extends State ///至尊喊话 vipDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Text descText = Text( lists.content!, style: TextStyle(color: Colors.white, fontSize: 17.sp), @@ -1137,58 +1147,151 @@ class _LikeViewState extends State ); }), ), - Container( - height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( + // Container( + // height: 30.sp, + // padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + // margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(15.sp), + // color: Color(0x33000000)), + // child: Row( + // children: [ + // widgets.isNotEmpty + // ? SizedBox( + // width: 24 + 12.sp * widgets.length - 8.sp, + // height: 24.sp, + // child: Stack(children: widgets), + // ) + // : Container(), + // SizedBox( + // width: 4.sp, + // ), + // widgets.isNotEmpty + // ? Expanded( + // child: Text( + // '${lists.chat!.count!}位圈友已私聊', + // style: TextStyle( + // color: Colors.white.withOpacity(0.75), + // fontSize: 14.sp), + // )) + // : Expanded( + // child: Text( + // '赶紧成为第一位私聊ta的圈友吧', + // style: TextStyle( + // color: Colors.white.withOpacity(0.75), + // fontSize: 14.sp), + // )), + // GestureDetector( + // onTap: () { + // pushMsgPage( + // lists, + // lists.interest!['id'].toString(), + // ); + // // pushHomePage( + // // lists, widget.bean.id.toString()); + // }, + // child: Image.asset( + // getCircleImage('chat'), + // width: 60.sp, + // ), + // ) + // ], + // ), + // ), + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) - : Container(), - SizedBox( - width: 4.sp, - ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () { - pushMsgPage( - lists, - lists.interest!['id'].toString(), - ); - // pushHomePage( - // lists, widget.bean.id.toString()); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + lists.interest!['id'].toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), + ) + ], ), - ) - ], - ), - ), + ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 5.sp : 0.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], + ), Container( margin: EdgeInsets.only(bottom: 10.sp, top: 5.sp), child: circleInfoItem(lists.interest, lists, index), @@ -1202,6 +1305,7 @@ class _LikeViewState extends State ///普通图文喊话 normalDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Text descText = Text( lists.content!, style: TextStyle(color: Colors.white, fontSize: 17.sp), @@ -1485,57 +1589,99 @@ class _LikeViewState extends State ); })) : Container(), - Container( - height: 30.sp, - padding: EdgeInsets.only( - left: 5.sp, - right: 10.sp, - ), - margin: - EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( + + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) - : Container(), - SizedBox( - width: 4.sp, + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + lists.interest!['id'].toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), + ) + ], + ), ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () async { - pushMsgPage( - lists, lists.interest!['id'].toString()); + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } - // }); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, - )) - ], - ), + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 5.sp : 0.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], ), Container( margin: EdgeInsets.only(bottom: 10.sp, top: 5.sp), @@ -1549,6 +1695,125 @@ class _LikeViewState extends State ); } + void _showEmojiPicker(Lists list,int id,BuildContext context, Offset position) { + if (isShowEmoji) return; + isShowEmoji = true; + _overlayEntry = OverlayEntry( + builder: (context) => Stack( + children: [ + // 遮罩层,点击关闭 + Positioned.fill( + child: GestureDetector( + onTap: () { + _removeOverlay(); + isShowEmoji = false; + }, + child: Container( + color: Colors.black.withOpacity(0.3), + ), + ), + ), + // 表情选择器 + Positioned( + left: position.dx - 190.w, + top: position.dy - 60.sp, + child: Material( + color: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 气泡框 + Container( + width: 200.w, // 设置最大宽度,超出才会滚动 + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black26, + blurRadius: 10, + spreadRadius: 2, + ), + ], + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: emojis.map((emoji) => Padding( + padding: EdgeInsets.symmetric(horizontal: 4), + child: _emojiButton(emoji,id,list), + )).toList(), + ),), + ), + // 底部倒三角形 + ], + ), + )), + Positioned( + left: position.dx - 12.w, + top: position.dy - 15, + child: CustomPaint( + size: Size(20, 10), + painter: TrianglePainter(), + ), + ) + ], + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + + } + + Widget _emojiButton(String emoji,int id,Lists list) { + return GestureDetector( + onTap: () async { + print("选择了表情: $emoji"); + _removeOverlay(); + isShowEmoji = false; + + int index = emojis.indexOf(emoji) + 1; + var result = await DioManager.instance.post(url: Api.interactEmoji,params: { + "calloutId": id, + "type": index + }); + if (result['code'] == 200) { + var data = await DioManager.instance.get(url: Api.signCalloutDetail,params: { + 'id':id, + }); + if (data['code'] == 200) { + Lists bean =Lists.fromJson(data['data']); + if (lists.contains(list)) { + index = lists.indexOf(list); + lists[index] = bean; + } else { + index = recomanddlists.indexOf(list); + recomanddlists[index] = bean; + } + if (mounted) { + setState(() { + + }); + } + } + } + }, + child: Text( + emoji, + style: TextStyle(fontSize: 25), + ), + ); + } + + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + } + + tipItem() { bool showTitle = lists.isEmpty; return GetBuilder(builder: (logic) { diff --git a/circle_app/lib/circle_app/circle/widgets/play_video_view.dart b/circle_app/lib/circle_app/circle/widgets/play_video_view.dart index 7d7f2db..5af71c0 100644 --- a/circle_app/lib/circle_app/circle/widgets/play_video_view.dart +++ b/circle_app/lib/circle_app/circle/widgets/play_video_view.dart @@ -10,6 +10,7 @@ import 'package:video_player/video_player.dart'; import '../../../commons/widgets/video_share_dialog.dart'; import '../../../net/api.dart'; import '../../../net/dio_manager.dart'; +import '../../../utils/cache_img.dart'; import '../../userinfo/logic.dart'; import '../../world_call_out/world_data.dart'; import 'controller/physics.dart'; @@ -20,8 +21,9 @@ class PlayVideoView extends StatefulWidget { String url; String callOutId; String userId; - - PlayVideoView(this.url, this.callOutId, this.userId, {Key? key}) + String imid; + Map chat; + PlayVideoView(this.url, this.callOutId, this.userId,this.chat,this.imid, {Key? key}) : super(key: key); @override State createState() => _PlayVideoViewState(); @@ -75,10 +77,12 @@ class _PlayVideoViewState extends State 'id': int.parse(widget.callOutId), 'user': { 'id': int.parse(widget.userId), + 'imId': widget.imid, }, 'album': [ {'type': 2, 'url': widget.url} - ] + ], + 'chat':widget.chat }); userList = [list]; @@ -213,6 +217,28 @@ class _PlayVideoViewState extends State scrollDirection: Axis.vertical, itemCount: _videoListController.videoCount, itemBuilder: (context, i) { + + WorldLists lists = userList[i]; + + List widgets = []; + int index = 0; + for (var element in lists.chat!.users!) { + widgets.add(Positioned( + left: 12.sp * index, + child: circleWidget(element.avatar!, element.id.toString(), width: 24), + )); + index++; + } + if (widgets.isNotEmpty) { + widgets.add(Positioned( + left: 12.sp * lists.chat!.users!.length, + child: Image.asset( + getCircleImage('more'), + width: 24.sp, + ))); + } + + // 拼一个视频组件出来 var player = _videoListController.playerOfIndex(i)!; var data = player.videoInfo!; @@ -267,6 +293,62 @@ class _PlayVideoViewState extends State // backgroundColor: Colors.black)), ), )), + Positioned(bottom: 5.sp + MediaQuery.of(context).padding.bottom,child: Container( + height: 30.sp, + width: Get.width - 20.sp, + padding: EdgeInsets.only( + left: 5.sp, + right: 5.sp, + ), + // margin: EdgeInsets.only( + // top: picHeight > 0 ? 5.sp : 10.sp, bottom: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Colors.white.withOpacity(0.15)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 14.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的圈友吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 14.sp), + )), + GestureDetector( + onTap: () async { + if (player.controller.value.isPlaying) { + await player.pause(); + } + setState(() {}); + pushChatPage(lists.user!.id!.toString(), + lists.user!.imId!.toString(), lists.user!.nickname ?? ''); + + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + )) + ], + ), + ),) ], ), ); @@ -349,4 +431,29 @@ class _PlayVideoViewState extends State ), ); } + + circleWidget(String url, String userId, {double width = 24}) { + return GestureDetector( + onTap: () async { + // pushUserHome(userId); + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: CachedImg( + imageUrl: url ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + ), + ) + ], + )); + } } diff --git a/circle_app/lib/circle_app/circle/widgets/video_item.dart b/circle_app/lib/circle_app/circle/widgets/video_item.dart index e6be690..6690b70 100644 --- a/circle_app/lib/circle_app/circle/widgets/video_item.dart +++ b/circle_app/lib/circle_app/circle/widgets/video_item.dart @@ -1,11 +1,15 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/circle_app/circle/widgets/play_video_view.dart'; +import 'package:circle_app/circle_app/world_call_out/world_data.dart'; import 'package:circle_app/utils/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../../net/api.dart'; +import '../../../net/dio_manager.dart'; import '../../../utils/cache_img.dart'; +import '../logic.dart'; class VideoItemWidget extends StatefulWidget { String url; @@ -17,17 +21,26 @@ class VideoItemWidget extends StatefulWidget { } class _VideoItemWidgetState extends State { + bool isPush = false; + @override Widget build(BuildContext context) { return Container( - // color: Colors.red, - width: Get.width - 120.sp, alignment: Alignment.topLeft, child: GestureDetector( - onTap: () { - Get.to(PlayVideoView(widget.url,widget.callOutId,widget.userId)); + onTap: () async { + if (isPush) return; + var data = await DioManager.instance.get(url: Api.signCalloutDetail,params: { + 'id':widget.callOutId, + }); + if (data['code'] == 200) { + WorldLists bean = WorldLists.fromJson(data['data']); + Get.to( + PlayVideoView(widget.url, widget.callOutId, widget.userId,bean.chat!.toJson(),bean.user!.imId!)); + } + isPush = false; }, child: IntrinsicWidth( child: Stack( diff --git a/circle_app/lib/circle_app/circle_list/logic.dart b/circle_app/lib/circle_app/circle_list/logic.dart index bd1ffdd..356e988 100644 --- a/circle_app/lib/circle_app/circle_list/logic.dart +++ b/circle_app/lib/circle_app/circle_list/logic.dart @@ -46,12 +46,8 @@ class LikeLogic extends GetxController { int pageType = 0; - List genderList = [ - MyConfigData('0', '全部', true) - ]; - List newgenderList = [ - MyConfigData('0', '全部', true) - ]; + List genderList = [MyConfigData('0', '全部', true)]; + List newgenderList = [MyConfigData('0', '全部', true)]; bool isNewPeople = false; @@ -77,19 +73,19 @@ class LikeLogic extends GetxController { sub = EventBusManager.on().listen((event) { changeCircle(event.param); }); - await loadMyInfo(); + rightCtr.addListener(() { - if (rightCtr.position.pixels == - rightCtr.position.maxScrollExtent) { + if (rightCtr.position.pixels == rightCtr.position.maxScrollExtent) { loadMore(); } }); + loadMyInfo(); - await initGerder(); - loadInviteData(); + // loadInviteData(); loadCircleListData(); loadMyCircleData(); loadCircleTypeData(); + initGerder(); } @override @@ -101,8 +97,7 @@ class LikeLogic extends GetxController { } initGerder() async { - var data1 = - await DioManager.instance.get(url: Api.getConfig, params: {}); + var data1 = await DioManager.instance.get(url: Api.getConfig, params: {}); var bean1 = BaseResponse.fromJson( data1, (data1) => ConfigBean.fromJson(data1)); @@ -113,7 +108,6 @@ class LikeLogic extends GetxController { if (int.parse(key) < 3) { genderList.add(MyConfigData(key, value, true)); newgenderList.add(MyConfigData(key, value, true)); - } }); // roleList.clear(); @@ -132,51 +126,36 @@ class LikeLogic extends GetxController { if (bean.isSuccess()) { if (isFirst) { isFirst = false; - // int type = getUserType( - // ( bean.data!.user.createTime?.isNotEmpty ?? false) - // ? bean.data!.user.createTime! - // : DateTime.now().toString()); - // if (type == 2) { - // currentIndex = -1; - // isNewPeople = true; - // } else { - // currentIndex = -2; - // } - // } - // - // if (!isLoadNewData && tabController == null) { isLoadNewData = true; + isLoad = false; update(); } - - } else { - isLoadFial = true; - showOKToast('网络不流畅哦,请检查网络情况'); + } else { + // isLoadFial = true; + // showOKToast('网络不流畅哦,请检查网络情况'); } update(); } loadData() { - loadInviteData(); + // loadInviteData(); loadCircleListData(); loadMyCircleData(); loadCircleTypeData(); } loadInviteData() async { + var data = await DioManager.instance.get(url: Api.inviteMainPage); + if (data['code'] == 200) { + Autogenerated result = Autogenerated.fromJson(data); - var data = await DioManager.instance.get(url: Api.inviteMainPage); - if (data['code'] == 200) { - Autogenerated result = Autogenerated.fromJson(data); - - homeData = result.data; - - } + homeData = result.data; + } } loadCircleListData() async { var data = await DioManager.instance.get( - url: Api.getCircleInterests, params: {"page": page, 'page_size': 20}); + url: Api.getCircleInterests, params: {"page": page, 'page_size': 10}); var bean = BaseResponse.fromJson( data, (data) => InterestsBean.fromJson(data)); if (bean.code == 200) { @@ -187,8 +166,8 @@ class LikeLogic extends GetxController { circle.lists.addAll(bean.data!.lists); } - isLoad = false; - if (bean.data!.lists.length < 20) { + + if (bean.data!.lists.length == 0) { isMore = false; } update(); @@ -199,8 +178,7 @@ class LikeLogic extends GetxController { } loadMyCircleData() async { - var data = await DioManager.instance - .get(url: Api.getMyCircleAll); + var data = await DioManager.instance.get(url: Api.getMyCircleAll); // var bean = BaseResponse.fromJson( // data, (data) => InterestsBean.fromJson(data)); @@ -215,7 +193,7 @@ class LikeLogic extends GetxController { }); mycircle.lists = infoList; if (currentIndex >= mycircle.lists.length - 1) { - currentIndex = mycircle.lists.length -1; + currentIndex = mycircle.lists.length - 1; } loadCalloutsNew(); @@ -232,13 +210,11 @@ class LikeLogic extends GetxController { loadMore() { if (isMore) { - page = page + 1; + page = page + 1; loadCircleListData(); } } - - void relaodData() { page = 1; isMore = true; @@ -247,12 +223,11 @@ class LikeLogic extends GetxController { loadMyMore() { if (isMyMore) { - myPage = myPage + 1; + myPage = myPage + 1; loadMyCircleData(); } } - void relaodCircleTypeData() { loadCircleTypeData(); } @@ -274,16 +249,15 @@ class LikeLogic extends GetxController { } }); - relaodMyData(); } showOKToast(bean.msg); } - setTopCircle(String interest_id,bool isStatus) async { + setTopCircle(String interest_id, bool isStatus) async { var data = await DioManager.instance.post( url: Api.circleTop, - params: {"interestId": interest_id,'isTop' :isStatus ? 1 : 0}); + params: {"interestId": interest_id, 'isTop': isStatus ? 1 : 0}); var bean = BaseResponse.fromJson(data, (data) => data); if (bean.code == 200) { relaodMyData(); @@ -291,15 +265,13 @@ class LikeLogic extends GetxController { showOKToast(bean.msg); } - loadCalloutsNew() async { List idList = []; mycircle.lists.forEach((element) { - idList.add(element.id.toString()); + idList.add(element.id.toString()); }); - var data = await DioManager.instance.post( - url:Api.calloutsNew, - params: {"interestIds":idList}); + var data = await DioManager.instance + .post(url: Api.calloutsNew, params: {"interestIds": idList}); if (data['code'] == 200) { hasNewList.clear(); @@ -323,7 +295,8 @@ class LikeLogic extends GetxController { loadCircleTypeData() async { var data = await DioManager.instance.get( - url:Api.categoriesList,); + url: Api.categoriesList, + ); if (data['code'] == 200) { categoriesList = data['data']; update(); @@ -336,7 +309,6 @@ class LikeLogic extends GetxController { mycircle.lists.forEach((element) { if (element.id.toString() == param) { changeIndex = mycircle.lists.indexOf(element); - } }); currentIndex = changeIndex; @@ -344,8 +316,7 @@ class LikeLogic extends GetxController { } } - class ChangeCircleIndex { String param; -ChangeCircleIndex(this.param); -} \ No newline at end of file + ChangeCircleIndex(this.param); +} diff --git a/circle_app/lib/circle_app/circle_list/view.dart b/circle_app/lib/circle_app/circle_list/view.dart index ee4b120..3e8acaa 100644 --- a/circle_app/lib/circle_app/circle_list/view.dart +++ b/circle_app/lib/circle_app/circle_list/view.dart @@ -44,6 +44,9 @@ class _CircleListPageState extends State int currentIndex = 1; + + + List tipList = [ '总有一个小众圈子适合你', '每一种情趣都值得被尊重', @@ -67,6 +70,15 @@ class _CircleListPageState extends State void initState() { // TODO: implement initState super.initState(); + logic.tabController = TabController( + length: 3, + vsync: this, + initialIndex: 1); + logic.tabController!.addListener(() { + // logic.tabIndex = logic.tabController!.index; + // currentIndex = logic.tabController!.index; + logic.update(); + }); } @override @@ -110,18 +122,6 @@ class _CircleListPageState extends State logic.update(); } - if (logic.isLoadNewData && logic.tabController == null) { - logic.tabController = TabController( - length: 3, - vsync: this, - initialIndex: 1); - logic.tabController!.addListener(() { - // logic.tabIndex = logic.tabController!.index; - // currentIndex = logic.tabController!.index; - logic.update(); - }); - logic.update(); - } return logic.isLoadFial ? noResultWidget( diff --git a/circle_app/lib/circle_app/circle_list/widgets/all_circle_item.dart b/circle_app/lib/circle_app/circle_list/widgets/all_circle_item.dart index 7948647..eec1842 100644 --- a/circle_app/lib/circle_app/circle_list/widgets/all_circle_item.dart +++ b/circle_app/lib/circle_app/circle_list/widgets/all_circle_item.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:circle_app/circle_app/circle_list/widgets/right_circle_iten.dart'; import 'package:circle_app/utils/eventBus.dart'; import 'package:flutter/material.dart'; import 'dart:async'; @@ -59,6 +60,13 @@ class _AllCircleItemState extends State Map interestAgentMap = {}; List visibleItems = []; + List emojis = [ + "❤️", "🪢", "⛓️", "🕯️", "🔐", "🔔", "⭕️", "📏", "🪡", "🎭", + "👙", "👅", "🦶", "🧎", "⚔️", "🍌", "🦋", "🌼", "👏", "🤟", + "🙏", "🦴", "🐶", "👿", "👼", "👻", "🌹", "💌", "😘", "😍", + "🫣", "😂", "🤐", "😱", "🫥" +]; OverlayEntry? _overlayEntry; + bool isScrolling = false; Timer? _timer; @@ -66,7 +74,7 @@ class _AllCircleItemState extends State var sub; var sub1; bool isLoadCircleInfo = false; - + bool isShowEmoji = false; int callOut = 0; @override @@ -432,7 +440,7 @@ class _AllCircleItemState extends State ), HideText( text: interest.intro + interest.intro, - maxWidth: Get.width * 0.5 - 5.sp, + maxWidth: Get.width * 0.5 - 9.sp, additionText: '进圈逛逛', maxLines: 2, style: TextStyle( @@ -621,6 +629,7 @@ class _AllCircleItemState extends State ///至尊喊话 vipDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, @@ -751,7 +760,7 @@ class _AllCircleItemState extends State // margin: EdgeInsets.only(top: 5.sp,right: 5.sp), padding: EdgeInsets.only(left: 15.sp, right: 15.sp), alignment: Alignment.center, - height: 28.sp, + height: 24.sp, decoration: BoxDecoration( color: Color.fromRGBO(52, 41, 67, 1), borderRadius: BorderRadius.only( @@ -763,7 +772,7 @@ class _AllCircleItemState extends State (lists.user!.city ?? '外星').length > 4 ? (lists.user!.city ?? '外星').substring(0, 4) + '...' : (lists.user!.city ?? '外星'), - style: TextStyle(color: Colors.white, fontSize: 15.sp), + style: TextStyle(color: Colors.white, fontSize: 14.sp), ), ) ], @@ -1024,55 +1033,96 @@ class _AllCircleItemState extends State }), ), ), - Container( - height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only( - top: picHeight > 0 ? 5.sp : 5.sp, bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) - : Container(), - SizedBox( - width: 4.sp, - ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () { - pushMsgPage( - lists, - '', - ); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage(lists, ''); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), + ) + ], ), - ) - ], - ), + ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 5.sp : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], ), if (lists.interest?.isNotEmpty ?? false) Container( @@ -1088,6 +1138,7 @@ class _AllCircleItemState extends State ///普通图文喊话 normalDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, @@ -1218,7 +1269,7 @@ class _AllCircleItemState extends State // margin: EdgeInsets.only(top: 5.sp,right: 5.sp), padding: EdgeInsets.only(left: 15.sp, right: 15.sp), alignment: Alignment.center, - height: 28.sp, + height: 24.sp, decoration: BoxDecoration( color: Color.fromRGBO(52, 41, 67, 1), borderRadius: BorderRadius.only( @@ -1230,7 +1281,7 @@ class _AllCircleItemState extends State (lists.user!.city ?? '外星').length > 4 ? (lists.user!.city ?? '外星').substring(0, 4) + '...' : (lists.user!.city ?? '外星'), - style: TextStyle(color: Colors.white, fontSize: 15.sp), + style: TextStyle(color: Colors.white, fontSize: 14.sp), ), ) ], @@ -1450,54 +1501,95 @@ class _AllCircleItemState extends State ); })) : Container(), - Container( - height: 30.sp, - padding: EdgeInsets.only( - left: 5.sp, - right: 10.sp, - ), - margin: EdgeInsets.only( - top: picHeight > 0 ? 5.sp : 10.sp, bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) - : Container(), - SizedBox( - width: 4.sp, + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage(lists, ''); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), + ) + ], + ), ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () async { - pushMsgPage(lists, ''); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, - )) - ], - ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + _showEmojiPicker(lists,lists.id!,context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp, bottom: (lists.topInteractType!['userCount'] ?? 0) > 0 ? 5.sp : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 ? lists.isInteract! - 1 : type] ?? '❤', + style: + TextStyle(color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: + TextStyle(color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], ), if (lists.interest?.isNotEmpty ?? false) Container( @@ -1518,9 +1610,124 @@ class _AllCircleItemState extends State )); } + void _showEmojiPicker(Lists list,int id,BuildContext context, Offset position) { + if (isShowEmoji) return; + isShowEmoji = true; + _overlayEntry = OverlayEntry( + builder: (context) => Stack( + children: [ + // 遮罩层,点击关闭 + Positioned.fill( + child: GestureDetector( + onTap: () { + _removeOverlay(); + isShowEmoji = false; + }, + child: Container( + color: Colors.black.withOpacity(0.3), + ), + ), + ), + // 表情选择器 + Positioned( + left: position.dx - 190.w, + top: position.dy - 60.sp, + child: Material( + color: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 气泡框 + Container( + width: 200.w, // 设置最大宽度,超出才会滚动 + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black26, + blurRadius: 10, + spreadRadius: 2, + ), + ], + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: emojis.map((emoji) => Padding( + padding: EdgeInsets.symmetric(horizontal: 4), + child: _emojiButton(emoji,id,list), + )).toList(), + ),), + ), + // 底部倒三角形 + ], + ), + )), + Positioned( + left: position.dx - 12.w, + top: position.dy - 15, + child: CustomPaint( + size: Size(20, 10), + painter: TrianglePainter(), + ), + ) + ], + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + + } + + Widget _emojiButton(String emoji,int id,Lists list) { + return GestureDetector( + onTap: () async { + print("选择了表情: $emoji"); + _removeOverlay(); + isShowEmoji = false; + + int index = emojis.indexOf(emoji) + 1; + var result = await DioManager.instance.post(url: Api.interactEmoji,params: { + "calloutId": id, + "type": index + }); + if (result['code'] == 200) { + var data = await DioManager.instance.get(url: Api.signCalloutDetail,params: { + 'id':id, + }); + if (data['code'] == 200) { + Lists bean =Lists.fromJson(data['data']); + index = lists.indexOf(list); + lists[index] = bean; + if (mounted) { + setState(() { + + }); + } + } + } + }, + child: Text( + emoji, + style: TextStyle(fontSize: 25), + ), + ); + } + + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + } + circleWidget(String url, String userId, {double width = 24}) { return GestureDetector( - onTap: () async {}, + onTap: () async { + pushUserHome(userId); + }, child: Stack( alignment: Alignment.center, children: [ @@ -1710,4 +1917,9 @@ class _AllCircleItemState extends State logic.update(); } } + + + void pushUserHome(String userId) { + Get.toNamed(Routes.UserInfoPage, arguments: userId); + } } diff --git a/circle_app/lib/circle_app/circle_list/widgets/apply_for_an_agent_dialog.dart b/circle_app/lib/circle_app/circle_list/widgets/apply_for_an_agent_dialog.dart new file mode 100644 index 0000000..9cb9cec --- /dev/null +++ b/circle_app/lib/circle_app/circle_list/widgets/apply_for_an_agent_dialog.dart @@ -0,0 +1,188 @@ +import 'package:circle_app/net/dio_manager.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:oktoast/oktoast.dart'; + +import '../../../commons/Widgets/base_tip_widget.dart'; +import '../../../commons/colors/app_color.dart'; +import '../../../net/api.dart'; +import '../../../router/routers.dart'; +import '../../../utils/util.dart'; + +class ApplyForAnAgentDialog extends StatefulWidget { + int circleId; + ApplyForAnAgentDialog({super.key,required this.circleId}); + + @override + _ApplyForAnAgentDialogState createState() => + new _ApplyForAnAgentDialogState(); + +} + +class _ApplyForAnAgentDialogState extends State { + // TODO: add state variables and methods + String msg = ''; + String price = ''; + @override + void initState() { + // TODO: implement initState + super.initState(); + loadContentData(); + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Dialog( + backgroundColor: Colors.transparent, + insetPadding:EdgeInsets.only(left: 20.sp,right: 20.sp), + child: Container( + height: 270.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: AppColor.bgColor, + borderRadius: BorderRadius.circular(12.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"),fit: BoxFit.fill,), + // ), + Container( + margin: EdgeInsets.only(top: 12.sp), + child: Column( + children: [ + Center( + child: Text( + "申请体验圈子代理人权益", + style: + TextStyle(color: Colors.white, fontSize: 18.sp), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only( + top: 0.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: SingleChildScrollView( + child: Text( + msg, + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + ), + ), + Row( + // mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + + GestureDetector( + onTap: () { + Get.back(); + Get.toNamed(Routes.InvitePage); + }, + child: Container( + width: 130.w, + alignment: Alignment.center, + height: 40.sp, + margin: EdgeInsets.only(bottom: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.sp), + gradient: const LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + child: const Text( + "前往邀请", + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + ), + ), + ), + GestureDetector( + onTap: () { + loadBuyInterestAgentData(); + }, + child: Container( + width: 130.w, + height: 40.sp, + alignment: Alignment.center, + margin: EdgeInsets.only(bottom: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.sp), + gradient: AppColor + .tagVerLinearGradient, + ), + child: Text( + "快速体验(${price})", + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + ), + ), + ), + ], + ) + ], + ), + ) + ], + ), + ), + ); + } + + void loadContentData() async { + var result = await DioManager.instance.get(url: Api.agentRights); + if (result['code'] == 10000) { + msg = result['content']; + await loadbuyInterestAgentPriceData(); + if (mounted) { + setState(() { + + }); + } + } + } + + loadbuyInterestAgentPriceData() async { + var result = await DioManager.instance.get(url: Api.buyInterestAgentPrice); + if (result['code'] == 200) { + price = result['data']; + } + } + + loadBuyInterestAgentData() async { + var result = await DioManager.instance.post(url: Api.buyInterestAgent,params: {'id':widget.circleId}); + if (result['code'] == 200) { + showOKToast('购买成功'); + Get.back(result: '1'); + } else if (result['code'] == 31201) { + showRechargeScreenDialog('buyInterestAgent'); + } + + } + + +} diff --git a/circle_app/lib/circle_app/circle_list/widgets/right_circle_iten.dart b/circle_app/lib/circle_app/circle_list/widgets/right_circle_iten.dart index dccf585..0891a76 100644 --- a/circle_app/lib/circle_app/circle_list/widgets/right_circle_iten.dart +++ b/circle_app/lib/circle_app/circle_list/widgets/right_circle_iten.dart @@ -36,7 +36,9 @@ import '../../../utils/SharedPreferencesHelper.dart'; import '../../../utils/cache_img.dart'; import '../../../utils/eventBus.dart'; import '../../circle_list/logic.dart'; +import '../../home/logic.dart'; import '../view.dart'; +import 'apply_for_an_agent_dialog.dart'; class RightCircleItem extends StatefulWidget { var logic; @@ -78,15 +80,19 @@ class _RightCircleItemState extends State int callRightOut = 0; + bool isLoadCirciInfo = false; + // TODO: add state variables and methods @override void dispose() { // TODO: implement dispose super.dispose(); + _tabController.removeListener(_handleTabChange); + scrollController.dispose(); + _tabController.dispose(); circleMoreInfoSub?.cancel(); sub.cancel(); - sub.cancel(); } @override @@ -98,9 +104,10 @@ class _RightCircleItemState extends State setState(() {}); }); - circleMoreInfoSub = EventBusManager.on().listen((event) { - if (event.type == _tabController.index + 1 && event.circleId == widget.bean.id && widget.logic.currentIndex == 0) { + if (event.type == _tabController.index + 1 && + event.circleId == widget.bean.id && + widget.logic.currentIndex == 0) { if (event.type == 1) { callLeftOut++; } else if (event.type == 2) { @@ -117,8 +124,6 @@ class _RightCircleItemState extends State _tabController = TabController(length: 2, vsync: this, initialIndex: 0); _tabController.addListener(_handleTabChange); - - scrollController.addListener(() { if (scrollController.position.pixels == scrollController.position.maxScrollExtent) { @@ -139,14 +144,13 @@ class _RightCircleItemState extends State } loadWelfareListData() async { - var data = await DioManager.instance - .post(url:Api.welfareList,params: {'interestId':circleId,'page':1,'pageSize':10}); + var data = await DioManager.instance.post( + url: Api.welfareList, + params: {'interestId': circleId, 'page': 1, 'pageSize': 10}); if (data['code'] == 200) { welfareList = data['data'] ?? []; if (mounted) { - setState(() { - - }); + setState(() {}); } } } @@ -165,11 +169,14 @@ class _RightCircleItemState extends State } } } - + // loadCircleInfo() async { + if (isLoadCirciInfo) return; + isLoadCirciInfo = true; var data = await DioManager.instance.get( url: "/up-service/interest/$circleId", ); + isLoadCirciInfo = false; if (data["code"] == 200) { widget.bean = Circle.fromJson(data['data']); if (mounted) { @@ -178,11 +185,8 @@ class _RightCircleItemState extends State } } - - - void getWelfareDetailData(String id,int index) async { - var result = - await DioManager.instance.get(url: Api.getWelfareDetail+id); + void getWelfareDetailData(String id, int index) async { + var result = await DioManager.instance.get(url: Api.getWelfareDetail + id); if (result['code'] == 200) { // "hasReceive" -> 1 if (result['data']['hasReceive'] == 1) { @@ -197,9 +201,10 @@ class _RightCircleItemState extends State } return; } - Get.bottomSheet(LuckyBagDialog(result['data']),isScrollControlled:true).then((value) async { + Get.bottomSheet(LuckyBagDialog(result['data']), isScrollControlled: true) + .then((value) async { var result = - await DioManager.instance.get(url: Api.getWelfareDetail+id); + await DioManager.instance.get(url: Api.getWelfareDetail + id); if (result['code'] == 200) { // "hasReceive" -> 1 if (result['data']['hasReceive'] == 1) { @@ -245,13 +250,22 @@ class _RightCircleItemState extends State await refreshCircleData(); } if (widget.bean.is_limit && widget.bean.amount > 0) { - Get.toNamed(Routes.UserInfoPage, arguments: userId,parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}); + Get.toNamed(Routes.UserInfoPage, arguments: userId, parameters: { + 'source': widget.index == 0 ? 'callout_list_hot' : 'callout_list_new', + 'bean': jsonEncode({ + 'id': widget.bean.id.toString(), + 'amount': widget.bean.amount.toString(), + 'oldAmount': widget.bean.oldAmount.toString(), + 'iosItem': widget.bean.ios_item + }) + }); // return; } else { - Get.toNamed(Routes.UserInfoPage, arguments: userId,parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}); + Get.toNamed(Routes.UserInfoPage, arguments: userId, parameters: { + 'source': widget.index == 0 ? 'callout_list_hot' : 'callout_list_new', + }); } - } circleWidget(String url, String userId, {double width = 24}) { @@ -321,10 +335,10 @@ class _RightCircleItemState extends State height: 30.sp, child: Row( children: [ - circlrPeopleInfoWidget(widgets,widget.bean), + circlrPeopleInfoWidget(widgets, widget.bean), Spacer(), GestureDetector( - //加入圈子 + //加入圈子 onTap: () async { if (widget.bean.isJoin) { Get.bottomSheet( @@ -342,7 +356,7 @@ class _RightCircleItemState extends State alignment: Alignment.center, children: [ Opacity( - opacity: 0.5, + opacity: 0.15, child: Image.asset( getCircleImage('add'), width: 60.sp, @@ -351,7 +365,8 @@ class _RightCircleItemState extends State Text( !widget.bean.isJoin ? '申请加入' : '分享有奖', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, + fontSize: 12.sp), ) ], )) @@ -380,100 +395,161 @@ class _RightCircleItemState extends State ), ), if (interestAgentMap.isNotEmpty) - Container( - margin: EdgeInsets.only(top: 5.sp), - decoration: BoxDecoration( - color: AppColor.bgColor, - borderRadius: BorderRadius.circular(8.sp)), - height: 40.sp, - padding: EdgeInsets.only(left: 8.sp, right: 8.sp), - child: Row( - children: [ - Text( - '今日圈子代理人:', - style: TextStyle(color: Colors.white, fontSize: 13.sp), - ), - GestureDetector( - onTap: () { - if (interestAgentMap.isNotEmpty) { - Get.toNamed(Routes.UserInfoPage, - arguments: interestAgentMap['user']['id'].toString()); - } - }, - child: Text( - interestAgentMap.isNotEmpty - ? interestAgentMap['user']['nickname'] - : '', - style: - TextStyle(color: AppColor.mainColor, fontSize: 13.sp), - ), - ), - SizedBox( - width: 4.sp, - ), - Image.asset( - getMineImage('bi_icon1'), - width: 20.sp, - ), - Text( - '${convertToThousand(interestAgentMap.isNotEmpty ? interestAgentMap['rewardCoin'] : 0)}', - style: TextStyle(color: Colors.white, fontSize: 13.sp), - ), - Expanded(child: Container()), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () { - addUmengTag('点击圈子打赏'); - showSendMoneyDialog(interestAgentMap['id'].toString()); - // Get.toNamed(AppRoutes.Invite); - }, - child: Container( + Row( + children: [ + Container( + width: 25.sp, + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 5.sp), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage( + getCircleImage('normal_bg'), + )), + + // color: AppColor.bgColor.withOpacity(0.5), + borderRadius: BorderRadius.circular(8.sp)), + height: 40.sp, + padding: EdgeInsets.only(left: 8.sp, right: 8.sp), + child: Row( + children: [ + Container( + height: 20.sp, + width: 20.sp, + margin: EdgeInsets.only(right: 4.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17.0), - gradient: const LinearGradient( - colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), - ], - ), - color: const Color(0xFF392D53), - ), - child: Container( - margin: EdgeInsets.all(0.6.sp), - padding: EdgeInsets.only( - left: 6.sp, right: 6.sp, top: 4.sp, bottom: 4.sp), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17.0), - color: const Color(0xFF392D53), - ), - child: Row( - children: [ - Image.asset( - getMsgImage('gift'), - width: 14.sp, - ), - SizedBox( - width: 2.sp, - ), - Text( - "打赏", - style: TextStyle( - fontSize: 12.sp, - color: Colors.white, - ), - ), - ], - ), + border: Border.all( + color: AppColor.mainColor, width: 1.sp), + borderRadius: BorderRadius.circular(10.sp)), + alignment: Alignment.center, + child: InkWell( + onTap: () async { + HomeLogic homeLogic = Get.find(); + if (homeLogic.agentManualStr.isEmpty) { + await homeLogic.loadManualata(); + } + String msg = homeLogic.agentManualStr; + showAgentManualDialog(context, msg); + }, + child: Icon( + Icons.question_mark_outlined, + color: AppColor.mainColor, + size: 15.w, + )), + ), + Text( + '代理人', + style: TextStyle(color: Colors.white, fontSize: 13.sp), + ), + Text( + ':', + style: TextStyle(color: Colors.white, fontSize: 13.sp), + ), + GestureDetector( + onTap: () { + if (interestAgentMap.isNotEmpty) { + Get.toNamed(Routes.UserInfoPage, + arguments: + interestAgentMap['user']['id'].toString()); + } + }, + child: Text( + interestAgentMap.isNotEmpty + ? interestAgentMap['user']['nickname'] + .toString() + .length > + 4 + ? interestAgentMap['user']['nickname'] + .toString() + .substring(0, 4) + + '..' + : interestAgentMap['user']['nickname'] + : '', + style: TextStyle( + color: AppColor.mainColor, fontSize: 13.sp), ), ), - ), - ], - ) - ], - ), + SizedBox( + width: 4.sp, + ), + Image.asset( + getMineImage('bi_icon1'), + width: 20.sp, + ), + Text( + '${convertToThousand(interestAgentMap.isNotEmpty ? interestAgentMap['rewardCoin'] : 0)}', + style: TextStyle(color: Colors.white, fontSize: 13.sp), + ), + Spacer(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + addUmengTag('点击圈子打赏'); + showSendMoneyDialog( + interestAgentMap['id'].toString()); + // Get.toNamed(AppRoutes.Invite); + }, + child: Container( + margin: EdgeInsets.only(left: 6.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + gradient: const LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + ), + color: Color(0xFF392D53).withOpacity(0.25), + ), + child: Container( + margin: EdgeInsets.all(0.6.sp), + padding: EdgeInsets.only( + left: 6.sp, + right: 6.sp, + top: 4.sp, + bottom: 4.sp), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + color: const Color(0xFF392D53), + ), + child: Row( + children: [ + Image.asset( + getMsgImage('gift'), + width: 14.sp, + ), + SizedBox( + width: 2.sp, + ), + Text( + "打赏", + style: TextStyle( + fontSize: 12.sp, + color: Colors.white, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + Container( + width: 25.sp, + ) + // Expanded(child: Container()), + ], ), ], ); @@ -575,8 +651,6 @@ class _RightCircleItemState extends State } List urlList = widget.bean.lastJoinUsers; - - List widgets = []; int i = 0; // print(urlList); @@ -603,7 +677,7 @@ class _RightCircleItemState extends State child: Container( width: Get.width, child: Stack( - alignment: Alignment.topCenter, + alignment: Alignment.topCenter, children: [ ClipRRect( borderRadius: BorderRadius.circular(10.sp), @@ -619,12 +693,13 @@ class _RightCircleItemState extends State height: Get.height, width: Get.width, margin: EdgeInsets.only(top: 72.sp), - child: NotificationListener( + child: NotificationListener( onNotification: (notification) { if (notification is OverscrollNotification && notification.overscroll < -15) { // 下拉刷新时禁用NestedScrollView的滚动 - if (refreshController.headerStatus != RefreshStatus.refreshing && + if (refreshController.headerStatus != + RefreshStatus.refreshing && scrollController.offset == 0) { count++; if (count == 2) { @@ -655,11 +730,11 @@ class _RightCircleItemState extends State return [ if (!isScrolled) - SliverToBoxAdapter( - child: circleTiitleWidget( - urlList, - widgets, - )), + SliverToBoxAdapter( + child: circleTiitleWidget( + urlList, + widgets, + )), SliverPersistentHeader( pinned: true, delegate: MySliverAppBarDelegate( @@ -684,17 +759,20 @@ class _RightCircleItemState extends State TabBar( isScrollable: true, controller: _tabController, - labelPadding: EdgeInsets.symmetric( - horizontal: 5.0.sp), + labelPadding: + EdgeInsets.symmetric( + horizontal: 5.0.sp), indicator: UnderlineTabIndicator( borderSide: BorderSide( - color: const Color(0xFF00FFF4), + color: + const Color(0xFF00FFF4), ), ), indicatorColor: const Color(0xFF00FFF4), indicatorWeight: 2.sp, - labelColor: const Color(0xFF00FFF4), + labelColor: + const Color(0xFF00FFF4), unselectedLabelColor: const Color(0xB3FFFFFF), indicatorSize: @@ -726,9 +804,11 @@ class _RightCircleItemState extends State fontSize: 18.sp, shadows: [ Shadow( - color: const Color(0xFFF657FF) - .withOpacity(0.5), - offset: Offset(0, -2), // 阴影偏移 + color: + const Color(0xFFF657FF) + .withOpacity(0.5), + offset: + Offset(0, -2), // 阴影偏移 blurRadius: 3, // 阴影模糊半径 // spreadRadius: 0 ), @@ -763,8 +843,10 @@ class _RightCircleItemState extends State alignment: Alignment.center, decoration: BoxDecoration( borderRadius: - BorderRadius.circular(17.0), - color: const Color(0xFF392D53), + BorderRadius.circular( + 17.0), + color: + const Color(0xFF392D53), border: GradientBoxBorder( gradient: AppColor .mainVerLinearGradient, @@ -914,158 +996,201 @@ class _RightCircleItemState extends State ), )), // Spacer(), - welfareList.length > 0 ? Container( - margin: EdgeInsets.only(right: 0.sp), - width: 160.sp, - height: 30.sp, - alignment: Alignment.centerRight, - child: CarouselSlider.builder( - options: CarouselOptions( - height: 30.0, - autoPlay: welfareList.length > 1, // 启用自动播放 - enlargeCenterPage: true, - autoPlayInterval: const Duration(seconds: 5), - aspectRatio: 1.0, - viewportFraction: 1.0), - itemBuilder: - (BuildContext context, int index, int realIndex) { - Map data = welfareList[index]; - String action = ''; - String tip = ''; - int type = 0; - action = '领取'; - tip = '发了福袋'; - return Container( - width: 170.sp, + welfareList.length > 0 + ? Container( + margin: EdgeInsets.only(right: 0.sp), + width: 160.sp, + height: 30.sp, alignment: Alignment.centerRight, - child: IntrinsicWidth( - child: Container( - // padding: EdgeInsets.only(left: 5.sp), - // width: 170.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color.fromRGBO(25, 10, 31, 1.0), - border: GradientBoxBorder( - gradient: - AppColor.mainVerLinearGradient, - width: 1.sp, - ), - ), - // image: DecorationImage( - // fit: BoxFit.fill, - // image: AssetImage(getCircleImage('normal_bg')))), - child:InkWell( - onTap: () { - getWelfareDetailData( - data['id'].toString(),index); - }, - child: Container( - margin: EdgeInsets.only(left: 5.sp, ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // ClipOval(child: CachedImg(imageUrl: data['user']['avatar'],fit: BoxFit.cover,width: 20.sp,height: 20.sp,)), - // SizedBox(width: 2.sp,), - GestureDetector( - onTap: () { - Get.toNamed(Routes.UserInfoPage, - arguments: - data['user']['id'].toString(),parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new'}); - }, - child: Text( - (data['user']['nickname'] ?? '') - .toString() - .length > - 4 - ? data['user']['nickname'] - .toString() - .substring(0, 4) + - '..' - : data['user']['nickname'], - style: TextStyle( - color: AppColor.mainColor, - fontSize: 13.sp, - fontWeight: FontWeight.w500), + child: CarouselSlider.builder( + options: CarouselOptions( + height: 30.0, + autoPlay: + welfareList.length > 1, // 启用自动播放 + enlargeCenterPage: true, + autoPlayInterval: + const Duration(seconds: 5), + aspectRatio: 1.0, + viewportFraction: 1.0), + itemBuilder: (BuildContext context, + int index, int realIndex) { + Map data = welfareList[index]; + String action = ''; + String tip = ''; + int type = 0; + action = '领取'; + tip = '发了福袋'; + return Container( + width: 170.sp, + alignment: Alignment.centerRight, + child: IntrinsicWidth( + child: Container( + // padding: EdgeInsets.only(left: 5.sp), + // width: 170.sp, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(15.sp), + color: Color.fromRGBO( + 25, 10, 31, 1.0), + border: GradientBoxBorder( + gradient: AppColor + .mainVerLinearGradient, + width: 1.sp, + ), + ), + // image: DecorationImage( + // fit: BoxFit.fill, + // image: AssetImage(getCircleImage('normal_bg')))), + child: InkWell( + onTap: () { + getWelfareDetailData( + data['id'].toString(), + index); + }, + child: Container( + margin: EdgeInsets.only( + left: 5.sp, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + // ClipOval(child: CachedImg(imageUrl: data['user']['avatar'],fit: BoxFit.cover,width: 20.sp,height: 20.sp,)), + // SizedBox(width: 2.sp,), + GestureDetector( + onTap: () { + Get.toNamed( + Routes.UserInfoPage, + arguments: + data['user'] + ['id'] + .toString(), + parameters: { + 'source': widget + .index == + 0 + ? 'callout_list_hot' + : 'callout_list_new' + }); + }, + child: Text( + (data['user']['nickname'] ?? + '') + .toString() + .length > + 4 + ? data['user'][ + 'nickname'] + .toString() + .substring( + 0, 4) + + '..' + : data['user'] + ['nickname'], + style: TextStyle( + color: AppColor + .mainColor, + fontSize: 13.sp, + fontWeight: + FontWeight + .w500), + ), + ), + Container( + margin: EdgeInsets.only( + right: 6.sp), + child: Text( + tip, + style: TextStyle( + color: + Colors.white, + fontSize: 13.sp, + fontWeight: + FontWeight + .w500), + )), + + Container( + alignment: + Alignment.center, + height: 30.sp, + padding: EdgeInsets.only( + left: 4.sp, + right: 4.sp), + decoration: BoxDecoration( + gradient: AppColor + .tagVerLinearGradient, + borderRadius: + BorderRadius + .circular( + 12.sp)), + child: Text( + action, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp), + ), + ) + ], ), ), - Container( - margin: EdgeInsets.only(right: 6.sp), - child: Text( - tip, - style: TextStyle( - color: Colors.white, - fontSize: 13.sp, - fontWeight: FontWeight.w500), - )), - - Container( - alignment: Alignment.center, - height: 30.sp, - padding: EdgeInsets.only( - left: 4.sp, right: 4.sp), - decoration: BoxDecoration( - gradient: - AppColor.tagVerLinearGradient, - borderRadius: - BorderRadius.circular(12.sp)), - child: Text( - action, - style: TextStyle( - color: Colors.white, fontSize: 14.sp), - ), - ) - ], + ), ), ), - ), - ), + ); + }, + itemCount: welfareList.length, ), - ); - }, - itemCount: welfareList.length, - ), - ) : GestureDetector( - onTap: () { - Get.toNamed(Routes.Send_lucky_bag,arguments: int.parse(circleId))! - .then((value) { - if (value != null) { - loadWelfareListData(); - } - } ); - }, - child: Container( - // padding: EdgeInsets.only(left: 5.sp,right: 5.sp), - width: 120.sp, - height: 28.sp, - // margin: EdgeInsets.only(right: 4.sp), - alignment: Alignment.center, - decoration: BoxDecoration( - gradient: AppColor.mainVerLinearGradient, - borderRadius: BorderRadius.circular(14.sp)), - child: Container( - decoration: BoxDecoration( - color: Color(0xFF423055), - borderRadius: BorderRadius.circular(14.sp)), - margin: EdgeInsets.all(1.sp), - alignment: Alignment.center, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - getBaseImage('fu_icon'), - width: 20.sp, - ), - SizedBox( - width: 2.sp, - ), - Text( - '发福袋涨人气', - style: TextStyle(color: Colors.white, fontSize: 13.sp), - ) - ], - )), - ), - ) + ) + : GestureDetector( + onTap: () { + Get.toNamed(Routes.Send_lucky_bag, + arguments: int.parse(circleId))! + .then((value) { + if (value != null) { + loadWelfareListData(); + } + }); + }, + child: Container( + // padding: EdgeInsets.only(left: 5.sp,right: 5.sp), + width: 120.sp, + height: 28.sp, + // margin: EdgeInsets.only(right: 4.sp), + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: + AppColor.mainVerLinearGradient, + borderRadius: + BorderRadius.circular(14.sp)), + child: Container( + decoration: BoxDecoration( + color: Color(0xFF423055), + borderRadius: + BorderRadius.circular(14.sp)), + margin: EdgeInsets.all(1.sp), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Image.asset( + getBaseImage('fu_icon'), + width: 20.sp, + ), + SizedBox( + width: 2.sp, + ), + Text( + '发福袋涨人气', + style: TextStyle( + color: Colors.white, + fontSize: 13.sp), + ) + ], + )), + ), + ) ], ), )), @@ -1075,7 +1200,6 @@ class _RightCircleItemState extends State getCircleImage('circle_line'), width: Get.width, )), - if (Get.currentRoute == Routes.Home) Positioned( bottom: 36.sp, @@ -1092,41 +1216,52 @@ class _RightCircleItemState extends State getCircleImage('send_msg'), width: 70.sp, ))), - if (Get.currentRoute == Routes.Home && _tabController.index == 0 && callLeftOut > 3) - Positioned(top: 70.sp,child: InkWell(onTap: () { - scrollController.animateTo(0, duration: Duration(milliseconds: 250), curve: Curves.easeInOut); - // EventBusManager.fire(RightScrollViewIsEnd(true)); - refreshController.requestRefresh(); - EventBusManager.fire( - RightRefreshContrller(_tabController.index)); - Future.delayed(Duration(milliseconds: 250),() { - refreshController.refreshCompleted(); - }); - - callLeftOut = 0; - if (mounted) { - setState(() { - - }); - } - },child: MoreDynamicTip())), - if (Get.currentRoute == Routes.Home && _tabController.index == 1 && callRightOut > 3) - Positioned(top: 70.sp,child: InkWell(onTap: () { - scrollController.animateTo(0, duration: Duration(milliseconds: 250), curve: Curves.easeInOut); - refreshController.requestRefresh(); - EventBusManager.fire( - RightRefreshContrller(_tabController.index)); - Future.delayed(Duration(milliseconds: 250),() { - refreshController.refreshCompleted(); - }); - callRightOut = 0; - if (mounted) { - setState(() { - - }); - } - },child: MoreDynamicTip())) + if (Get.currentRoute == Routes.Home && + _tabController.index == 0 && + callLeftOut > 3) + Positioned( + top: 70.sp, + child: InkWell( + onTap: () { + scrollController.animateTo(0, + duration: Duration(milliseconds: 250), + curve: Curves.easeInOut); + // EventBusManager.fire(RightScrollViewIsEnd(true)); + refreshController.requestRefresh(); + EventBusManager.fire( + RightRefreshContrller(_tabController.index)); + Future.delayed(Duration(milliseconds: 250), () { + refreshController.refreshCompleted(); + }); + callLeftOut = 0; + if (mounted) { + setState(() {}); + } + }, + child: MoreDynamicTip())), + if (Get.currentRoute == Routes.Home && + _tabController.index == 1 && + callRightOut > 3) + Positioned( + top: 70.sp, + child: InkWell( + onTap: () { + scrollController.animateTo(0, + duration: Duration(milliseconds: 250), + curve: Curves.easeInOut); + refreshController.requestRefresh(); + EventBusManager.fire( + RightRefreshContrller(_tabController.index)); + Future.delayed(Duration(milliseconds: 250), () { + refreshController.refreshCompleted(); + }); + callRightOut = 0; + if (mounted) { + setState(() {}); + } + }, + child: MoreDynamicTip())) ], ))); } @@ -1290,106 +1425,19 @@ class _RightCircleItemState extends State } Get.toNamed(Routes.Chat, arguments: con); } else if (data['code'] == 32104) { - showReportDialog(Get.context!, data['msg']); + showReportDialog(Get.context!, circleId); } } - void showReportDialog(BuildContext context, String msg) { + void showReportDialog(BuildContext context, String circleId) { showDialog( context: context, builder: (BuildContext context) { - return Dialog( - backgroundColor: Colors.transparent, - child: Container( - height: 200.sp, - padding: const EdgeInsets.all(1.0), - child: Stack( - children: [ - Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: AppColor.bgColor, - borderRadius: BorderRadius.circular(12.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"),fit: BoxFit.fill,), - // ), - 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: 12.sp, left: 14.sp, right: 14.sp), - alignment: Alignment.center, - child: Text( - msg, - textAlign: TextAlign.left, - style: TextStyle( - color: const Color(0xCCF7FAFA), fontSize: 16.sp), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.back(); - Get.toNamed(Routes.InvitePage); - }, - 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, - ), - ), - ), - ) - ], - ) - ], - ), - ) - ], - ), - ), - ); + return ApplyForAnAgentDialog(circleId: int.parse(circleId)); }, - ); + ).then((value) { + loadInterestAgent(); + }); } void showSendMoneyDialog(String userId) { @@ -1439,6 +1487,44 @@ class _RightCircleListWidgetState extends State Map interestAgentMap = {}; List visibleItems = []; + List emojis = [ + "❤️", + "🪢", + "⛓️", + "🕯️", + "🔐", + "🔔", + "⭕️", + "📏", + "🪡", + "🎭", + "👙", + "👅", + "🦶", + "🧎", + "⚔️", + "🍌", + "🦋", + "🌼", + "👏", + "🤟", + "🙏", + "🦴", + "🐶", + "👿", + "👼", + "👻", + "🌹", + "💌", + "😘", + "😍", + "🫣", + "😂", + "🤐", + "😱", + "🫥" + ]; + bool isScrolling = false; Timer? _timer; @@ -1446,6 +1532,9 @@ class _RightCircleListWidgetState extends State var sub; var sub1; bool isLoadCircleInfo = false; + + bool isShowEmoji = false; + @override void dispose() { // TODO: implement dispose @@ -1473,7 +1562,6 @@ class _RightCircleListWidgetState extends State StreamSubscription? cicleInfoRefresh = null; StreamSubscription? scroToTop = null; - @override void initState() { // TODO: implement initState @@ -1500,7 +1588,6 @@ class _RightCircleListWidgetState extends State } }); - scrollController.addListener(() { if (scrollController.offset <= 0) { // EventBusManager.fire(RightScrollViewScrollTop()); @@ -1533,12 +1620,9 @@ class _RightCircleListWidgetState extends State }); } - - void isScrollingListener() { if (scrollController.hasClients && - scrollController.position.isScrollingNotifier - .hasListeners) { + scrollController.position.isScrollingNotifier.hasListeners) { isScrolling = scrollController.position.isScrollingNotifier.value; if (isScrolling) { isScrolling = true; @@ -1575,19 +1659,6 @@ class _RightCircleListWidgetState extends State } - loadCircleInfo() async { - var data = await DioManager.instance.get( - url: "/up-service/interest/$circleId", - ); - if (data["code"] == 200) { - widget.bean = Circle.fromJson(data['data']); - isLoadCircleInfo = true; - if (mounted) { - setState(() {}); - } - } - } - loadCallOutListData() async { var data = await DioManager.instance.get( url: widget.type == 0 @@ -1648,8 +1719,9 @@ class _RightCircleListWidgetState extends State } void pushOtherPeopleHomePage(String userId) { - Get.toNamed(Routes.UserInfoPage, arguments: userId,parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new'}); - + Get.toNamed(Routes.UserInfoPage, arguments: userId, parameters: { + 'source': widget.index == 0 ? 'callout_list_hot' : 'callout_list_new' + }); } void pushHomePage(Lists bean, String cicleId) async { @@ -1658,7 +1730,12 @@ class _RightCircleListWidgetState extends State if (bean.user!.id == userId) { Get.toNamed(Routes.UserInfoPage); } else { - Get.toNamed(Routes.UserInfoPage, arguments: bean.user!.id!.toString(),parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new'}); + Get.toNamed(Routes.UserInfoPage, + arguments: bean.user!.id!.toString(), + parameters: { + 'source': + widget.index == 0 ? 'callout_list_hot' : 'callout_list_new' + }); } }); } @@ -1731,9 +1808,9 @@ class _RightCircleListWidgetState extends State @override Widget build(BuildContext context) { - if (widget.bean.image.isEmpty && !isLoadCircleInfo) { - loadCircleInfo(); - } + // if (widget.bean.image.isEmpty && !isLoadCircleInfo) { + // loadCircleInfo(); + // } List urlList = widget.bean.lastJoinUsers; List widgets = []; int i = 0; @@ -1756,64 +1833,66 @@ class _RightCircleListWidgetState extends State return !callOutMore && lists.isEmpty ? noResultWidget() - :NotificationListener( - onNotification: (notification) { - if (notification is OverscrollNotification && - notification.overscroll < -5) { - if (isEnd) { - isEnd = false; - widget.scrollController.animateTo(0, - duration: Duration(milliseconds: 200), - curve: Curves.easeIn); - setState(() {}); - } - } + : NotificationListener( + onNotification: (notification) { + if (notification is OverscrollNotification && + notification.overscroll < -5) { + if (isEnd) { + isEnd = false; + widget.scrollController.animateTo(0, + duration: Duration(milliseconds: 200), + curve: Curves.easeIn); + setState(() {}); + } + } - return true; - }, - child: SmartRefresher( - controller: refreshController, - // onRefresh: refreshData, - enablePullDown: false, - onLoading: loadMore, - enablePullUp: true, - child: ListView.builder( - physics: !isEnd ? NeverScrollableScrollPhysics() : ClampingScrollPhysics(), - addAutomaticKeepAlives: false, - addRepaintBoundaries: false, - scrollDirection: Axis.vertical, - controller: scrollController, - itemCount: lists.length, - shrinkWrap: true, - itemBuilder: (context, index) { - if (widget.type == 0) { - scrollController.position.isScrollingNotifier - .addListener(isScrollingListener); - } - Lists list = lists[index]; - if (list.isQueen!) { - return VisibilityDetector( - key: Key(index.toString()), - onVisibilityChanged: (visibilityInfo) { - _onVisibilityChanged( - index, - visibilityInfo.visibleFraction > 0.0, - ); - }, - child:vipDynamicItem(list)); - } else { - return VisibilityDetector( - key: Key(index.toString()), - onVisibilityChanged: (visibilityInfo) { - _onVisibilityChanged( - index, - visibilityInfo.visibleFraction > 0.0, - ); - }, - child:normalDynamicItem(list)); - } - })), - ); + return true; + }, + child: SmartRefresher( + controller: refreshController, + // onRefresh: refreshData, + enablePullDown: false, + onLoading: loadMore, + enablePullUp: true, + child: ListView.builder( + physics: !isEnd + ? NeverScrollableScrollPhysics() + : ClampingScrollPhysics(), + addAutomaticKeepAlives: false, + addRepaintBoundaries: false, + scrollDirection: Axis.vertical, + controller: scrollController, + itemCount: lists.length, + shrinkWrap: true, + itemBuilder: (context, index) { + if (widget.type == 0) { + scrollController.position.isScrollingNotifier + .addListener(isScrollingListener); + } + Lists list = lists[index]; + if (list.isQueen!) { + return VisibilityDetector( + key: Key(index.toString()), + onVisibilityChanged: (visibilityInfo) { + _onVisibilityChanged( + index, + visibilityInfo.visibleFraction > 0.0, + ); + }, + child: vipDynamicItem(list)); + } else { + return VisibilityDetector( + key: Key(index.toString()), + onVisibilityChanged: (visibilityInfo) { + _onVisibilityChanged( + index, + visibilityInfo.visibleFraction > 0.0, + ); + }, + child: normalDynamicItem(list)); + } + })), + ); } void _onVisibilityChanged(int index, bool visible) async { @@ -1827,9 +1906,9 @@ class _RightCircleListWidgetState extends State } } - ///至尊喊话 vipDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, @@ -1891,7 +1970,6 @@ class _RightCircleListWidgetState extends State } else { picHeight = picWidth; } - } } else { picHeight = 200.sp; @@ -1920,16 +1998,15 @@ class _RightCircleListWidgetState extends State ), )); }); - atWidget = - Container( - padding: EdgeInsets.only(left: 10.sp, right: 10.sp, top: 5.sp), - child: Row( - children: [ - Wrap( - children: atList, - ), - ], - )); + atWidget = Container( + padding: EdgeInsets.only(left: 10.sp, right: 10.sp, top: 5.sp), + child: Row( + children: [ + Wrap( + children: atList, + ), + ], + )); } // double widgetHeight = 130.sp + contentHeight(lists.content!) + picHeight; @@ -1961,7 +2038,7 @@ class _RightCircleListWidgetState extends State // margin: EdgeInsets.only(top: 5.sp,right: 5.sp), padding: EdgeInsets.only(left: 15.sp, right: 15.sp), alignment: Alignment.center, - height: 28.sp, + height: 24.sp, decoration: BoxDecoration( color: Color.fromRGBO(52, 41, 67, 1), borderRadius: BorderRadius.only( @@ -1973,7 +2050,7 @@ class _RightCircleListWidgetState extends State (lists.user!.city ?? '外星').length > 4 ? (lists.user!.city ?? '外星').substring(0, 4) + '...' : (lists.user!.city ?? '外星'), - style: TextStyle(color: Colors.white, fontSize: 15.sp), + style: TextStyle(color: Colors.white, fontSize: 14.sp), ), ) ], @@ -2042,8 +2119,11 @@ class _RightCircleListWidgetState extends State padding: EdgeInsets.all(2.sp), child: ClipRRect( borderRadius: BorderRadius.circular(30.sp), - child: Image.network(lists.user!.avatar_thumb!, - width: 40.sp, height: 40.sp, fit: BoxFit.cover), + child: Image.network( + lists.user!.avatar_thumb!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover), ), ), if ((lists.user!.onlineFlag ?? '').isNotEmpty) @@ -2051,13 +2131,15 @@ class _RightCircleListWidgetState extends State bottom: 0, child: Container( height: 20.sp, - padding: - EdgeInsets.only(left: 4.sp, right: 4.sp), + padding: EdgeInsets.only( + left: 4.sp, right: 4.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.sp), + borderRadius: + BorderRadius.circular(10.sp), color: AppColor.bgColor, border: GradientBoxBorder( - gradient: AppColor.mainVerLinearGradient, + gradient: + AppColor.mainVerLinearGradient, width: 1.sp, ), ), @@ -2070,7 +2152,6 @@ class _RightCircleListWidgetState extends State fontSize: 10.sp, ), ))) - ], )), Expanded( @@ -2148,144 +2229,233 @@ class _RightCircleListWidgetState extends State child: picHeight == 200.sp ? ClipRRect( borderRadius: BorderRadius.circular(6.sp), - child: VideoItemWidget(lists.album![0].url!,lists.id!.toString(),lists.user!.id.toString())) - : picHeight == 250 ? GestureDetector( - onTap: () async { - var imgList = []; - for (var element in lists.album!) { - imgList.add(element.url!); - } - Map params = {}; - if (widget.bean.is_limit && widget.bean.amount > 0) { - await refreshCircleData(); - } - if (widget.bean.is_limit && widget.bean.amount > 0) { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}; - - // return; - } else { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}; - } - - - Get.toNamed(Routes.SwiperPage, - arguments: { - 'imaglist': imgList, - 'index': 0, - 'userId':lists.user?.id!.toString() - },parameters: params); - }, - child: ClipRRect( - borderRadius: - BorderRadius.circular(6.sp), - child: CachedImg( - imageUrl: lists.album!.first.url!, - fit: BoxFit.cover, - ), - ), - ) : GridView.builder( - controller: GridScrollController, - itemCount: lists.album!.length, - scrollDirection: Axis.vertical, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, //横轴三个子widget - crossAxisSpacing: 8.sp, - mainAxisSpacing: 8.sp, - childAspectRatio: 0.6 //宽高比为1时,子widget - ), - itemBuilder: (contentxt, currentIndex) { - Album album = lists.album![currentIndex]; - return GestureDetector( + child: VideoItemWidget( + lists.album![0].url!, + lists.id!.toString(), + lists.user!.id.toString())) + : picHeight == 250 + ? GestureDetector( onTap: () async { - - if (widget.bean.is_limit && widget.bean.amount > 0) { - await refreshCircleData(); - } - - var imgList = []; for (var element in lists.album!) { imgList.add(element.url!); } Map params = {}; - if (widget.bean.is_limit && widget.bean.amount > 0) { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}; + if (widget.bean.is_limit && + widget.bean.amount > 0) { + await refreshCircleData(); + } + if (widget.bean.is_limit && + widget.bean.amount > 0) { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + 'bean': jsonEncode({ + 'id': widget.bean.id.toString(), + 'amount': widget.bean.amount.toString(), + 'oldAmount': + widget.bean.oldAmount.toString(), + 'iosItem': widget.bean.ios_item + }) + }; // return; } else { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}; + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + }; } - Get.toNamed(Routes.SwiperPage, arguments: { 'imaglist': imgList, - 'index': currentIndex, - 'userId':lists.user?.id!.toString() - },parameters: params); + 'index': 0, + 'userId': lists.user?.id!.toString() + }, + parameters: params); }, child: ClipRRect( borderRadius: BorderRadius.circular(6.sp), child: CachedImg( - imageUrl: album.url!, + imageUrl: lists.album!.first.url!, fit: BoxFit.cover, ), ), - ); - }), + ) + : GridView.builder( + controller: GridScrollController, + itemCount: lists.album!.length, + scrollDirection: Axis.vertical, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 8.sp, + mainAxisSpacing: 8.sp, + childAspectRatio: 0.6 //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = lists.album![currentIndex]; + return GestureDetector( + onTap: () async { + if (widget.bean.is_limit && + widget.bean.amount > 0) { + await refreshCircleData(); + } + + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Map params = {}; + if (widget.bean.is_limit && + widget.bean.amount > 0) { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + 'bean': jsonEncode({ + 'id': widget.bean.id.toString(), + 'amount': + widget.bean.amount.toString(), + 'oldAmount': widget.bean.oldAmount + .toString(), + 'iosItem': widget.bean.ios_item + }) + }; + + // return; + } else { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + }; + } + + Get.toNamed(Routes.SwiperPage, + arguments: { + 'imaglist': imgList, + 'index': currentIndex, + 'userId': lists.user?.id!.toString() + }, + parameters: params); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: CachedImg( + imageUrl: album.url!, + fit: BoxFit.cover, + ), + ), + ); + }), ), ), - Container( - height: 30.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only( - top: picHeight > 0 ? 5.sp : 5.sp, bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 14.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 14.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + widget.bean.id.toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), ) - : Container(), - SizedBox( - width: 4.sp, - ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () { - pushMsgPage( - lists, - widget.bean.id.toString(), - ); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, + ], ), - ) - ], - ), + ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + _showEmojiPicker( + lists, lists.id!, context, details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only( + left: 10.sp, + bottom: + (lists.topInteractType!['userCount'] ?? 0) > 0 + ? 10.sp + : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 + ? lists.isInteract! - 1 + : type] ?? + '❤', + style: TextStyle( + color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: TextStyle( + color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], ) ], ), @@ -2295,6 +2465,8 @@ class _RightCircleListWidgetState extends State ///普通图文喊话 normalDynamicItem(Lists lists) { + int type = (lists.topInteractType?['type'] ?? 1) - 1; + Widget descText = widget.logic.openCallOutIdList.contains(lists.id) ? Text( lists.content!, @@ -2338,7 +2510,6 @@ class _RightCircleListWidgetState extends State } else { picHeight = picWidth; } - } } else { picHeight = 200.sp; @@ -2385,16 +2556,15 @@ class _RightCircleListWidgetState extends State ), )); }); - atWidget = - Container( - padding: EdgeInsets.only(bottom: 5.sp), - child: Row( - children: [ - Wrap( - children: atList, - ), - ], - )); + atWidget = Container( + padding: EdgeInsets.only(bottom: 5.sp), + child: Row( + children: [ + Wrap( + children: atList, + ), + ], + )); } return Container( @@ -2423,7 +2593,7 @@ class _RightCircleListWidgetState extends State // margin: EdgeInsets.only(top: 5.sp,right: 5.sp), padding: EdgeInsets.only(left: 15.sp, right: 15.sp), alignment: Alignment.center, - height: 28.sp, + height: 24.sp, decoration: BoxDecoration( color: Color.fromRGBO(52, 41, 67, 1), borderRadius: BorderRadius.only( @@ -2435,7 +2605,7 @@ class _RightCircleListWidgetState extends State (lists.user!.city ?? '外星').length > 4 ? (lists.user!.city ?? '外星').substring(0, 4) + '...' : (lists.user!.city ?? '外星'), - style: TextStyle(color: Colors.white, fontSize: 15.sp), + style: TextStyle(color: Colors.white, fontSize: 14.sp), ), ) ], @@ -2502,7 +2672,8 @@ class _RightCircleListWidgetState extends State width: 41.sp, height: 41.sp, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20.5.sp), + borderRadius: + BorderRadius.circular(20.5.sp), gradient: const LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, @@ -2516,8 +2687,11 @@ class _RightCircleListWidgetState extends State padding: EdgeInsets.all(2.sp), child: ClipRRect( borderRadius: BorderRadius.circular(30.sp), - child: Image.network(lists.user!.avatar_thumb!, - width: 40.sp, height: 40.sp, fit: BoxFit.cover), + child: Image.network( + lists.user!.avatar_thumb!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover), ), ), if ((lists.user!.onlineFlag ?? '').isNotEmpty) @@ -2525,13 +2699,15 @@ class _RightCircleListWidgetState extends State bottom: 0, child: Container( height: 20.sp, - padding: - EdgeInsets.only(left: 4.sp, right: 4.sp), + padding: EdgeInsets.only( + left: 4.sp, right: 4.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.sp), + borderRadius: + BorderRadius.circular(10.sp), color: AppColor.bgColor, border: GradientBoxBorder( - gradient: AppColor.mainVerLinearGradient, + gradient: AppColor + .mainVerLinearGradient, width: 1.sp, ), ), @@ -2622,143 +2798,243 @@ class _RightCircleListWidgetState extends State child: picHeight == 200.sp ? ClipRRect( borderRadius: BorderRadius.circular(6.sp), - child: VideoItemWidget(lists.album![0].url!,lists.id!.toString(),lists.user!.id.toString())) - : picHeight == 250 ? GestureDetector( - onTap: () async { - var imgList = []; - for (var element in lists.album!) { - imgList.add(element.url!); - } - Map params = {}; - if (widget.bean.is_limit && widget.bean.amount > 0) { - await refreshCircleData(); - } - if (widget.bean.is_limit && widget.bean.amount > 0) { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}; - - // return; - } else { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}; - } - - - Get.toNamed(Routes.SwiperPage, - arguments: { - 'imaglist': imgList, - 'index': 0, - 'userId':lists.user?.id!.toString() - },parameters: params); - }, - child: ClipRRect( - borderRadius: - BorderRadius.circular(6.sp), - child: CachedImg( - imageUrl: lists.album!.first.url!, - fit: BoxFit.cover, - ), - ), - ) : GridView.builder( - controller: GridScrollController, - itemCount: lists.album!.length, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, //横轴三个子widget - crossAxisSpacing: 4.sp, - mainAxisSpacing: 4.sp, - childAspectRatio: - ratio //宽高比为1时,子widget - ), - itemBuilder: (contentxt, currentIndex) { - Album album = lists.album![currentIndex]; - return GestureDetector( + child: VideoItemWidget( + lists.album![0].url!, + lists.id!.toString(), + lists.user!.id.toString())) + : picHeight == 250 + ? GestureDetector( onTap: () async { var imgList = []; for (var element in lists.album!) { imgList.add(element.url!); } Map params = {}; - if (widget.bean.is_limit && widget.bean.amount > 0) { + if (widget.bean.is_limit && + widget.bean.amount > 0) { await refreshCircleData(); } - if (widget.bean.is_limit && widget.bean.amount > 0) { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}; + if (widget.bean.is_limit && + widget.bean.amount > 0) { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + 'bean': jsonEncode({ + 'id': widget.bean.id.toString(), + 'amount': + widget.bean.amount.toString(), + 'oldAmount': widget.bean.oldAmount + .toString(), + 'iosItem': widget.bean.ios_item + }) + }; // return; } else { - params = {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}; + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + }; } - Get.toNamed(Routes.SwiperPage, arguments: { 'imaglist': imgList, - 'index': currentIndex, - 'userId':lists.user?.id!.toString() - },parameters: params); + 'index': 0, + 'userId': + lists.user?.id!.toString() + }, + parameters: params); }, child: ClipRRect( borderRadius: BorderRadius.circular(6.sp), child: CachedImg( - imageUrl: album.url!, + imageUrl: lists.album!.first.url!, fit: BoxFit.cover, ), ), - ); - })) - : Container(), - Container( - height: 30.sp, - padding: EdgeInsets.only( - left: 5.sp, - right: 10.sp, - ), - margin: EdgeInsets.only( - top: picHeight > 0 ? 5.sp : 10.sp, bottom: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.sp), - color: Color(0x33000000)), - child: Row( - children: [ - widgets.isNotEmpty - ? SizedBox( - width: 24 + 12.sp * widgets.length - 8.sp, - height: 24.sp, - child: Stack(children: widgets), - ) - : Container(), - SizedBox( - width: 4.sp, - ), - widgets.isNotEmpty - ? Expanded( - child: Text( - '${lists.chat!.count!}位圈友已私聊', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )) - : Expanded( - child: Text( - '赶紧成为第一位私聊ta的圈友吧', - style: TextStyle( - color: Colors.white.withOpacity(0.75), - fontSize: 14.sp), - )), - GestureDetector( - onTap: () async { - pushMsgPage(lists, widget.bean.id.toString()); + ) + : GridView.builder( + controller: GridScrollController, + itemCount: lists.album!.length, + physics: + const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 4.sp, + mainAxisSpacing: 4.sp, + childAspectRatio: + ratio //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = + lists.album![currentIndex]; + return GestureDetector( + onTap: () async { + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Map params = {}; + if (widget.bean.is_limit && + widget.bean.amount > 0) { + await refreshCircleData(); + } + if (widget.bean.is_limit && + widget.bean.amount > 0) { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + 'bean': jsonEncode({ + 'id': + widget.bean.id.toString(), + 'amount': widget.bean.amount + .toString(), + 'oldAmount': widget + .bean.oldAmount + .toString(), + 'iosItem': + widget.bean.ios_item + }) + }; - // }); - }, - child: Image.asset( - getCircleImage('chat'), - width: 60.sp, - )) - ], - ), - ), + // return; + } else { + params = { + 'source': widget.index == 0 + ? 'callout_list_hot' + : 'callout_list_new', + }; + } + + Get.toNamed(Routes.SwiperPage, + arguments: { + 'imaglist': imgList, + 'index': currentIndex, + 'userId': + lists.user?.id!.toString() + }, + parameters: params); + }, + child: ClipRRect( + borderRadius: + BorderRadius.circular(6.sp), + child: CachedImg( + imageUrl: album.url!, + fit: BoxFit.cover, + ), + ), + ); + })) + : Container(), + Row( + children: [ + Expanded( + child: Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only( + top: picHeight > 0 ? 5.sp : 5.sp, bottom: 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 2.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的人吧', + style: TextStyle( + color: Colors.white.withOpacity(0.75), + fontSize: 13.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage( + lists, + widget.bean.id.toString(), + ); + }, + child: Image.asset( + getCircleImage('chat'), + width: 50.sp, + ), + ) + ], + ), + ), + ), + GestureDetector( + onTapUp: (TapUpDetails details) { + if (lists.isInteract! > 0) { + showOKToast('这个喊话已经点过了哦'); + return; + } + + _showEmojiPicker(lists, lists.id!, context, + details.globalPosition); + }, + child: Container( + margin: EdgeInsets.only( + left: 10.sp, + bottom: + (lists.topInteractType!['userCount'] ?? 0) > 0 + ? 10.sp + : 5.sp), + // height: 40.sp, + alignment: Alignment.center, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + height: 43.sp, + ), + Text( + emojis[lists.isInteract! > 0 + ? lists.isInteract! - 1 + : type] ?? + '❤', + style: TextStyle( + color: Colors.white, fontSize: 20.sp), + ), + if ((lists.topInteractType!['userCount'] ?? 0) > + 0) + Positioned( + bottom: 0, + child: Text( + '${lists.topInteractType!['userCount']}', + style: TextStyle( + color: Colors.white, fontSize: 10.sp), + ), + ), + ], + ), + ), + ), + ], + ) ], ), ), @@ -2865,7 +3141,7 @@ class _RightCircleListWidgetState extends State alignment: Alignment.center, children: [ Opacity( - opacity: 0.5, + opacity: 0.15, child: Image.asset( getCircleImage('add'), width: 60.sp, @@ -2882,19 +3158,141 @@ class _RightCircleListWidgetState extends State )); } + OverlayEntry? _overlayEntry; + + void _showEmojiPicker( + Lists list, int id, BuildContext context, Offset position) { + if (isShowEmoji) return; + isShowEmoji = true; + _overlayEntry = OverlayEntry( + builder: (context) => Stack( + children: [ + // 遮罩层,点击关闭 + Positioned.fill( + child: GestureDetector( + onTap: () { + _removeOverlay(); + isShowEmoji = false; + }, + child: Container( + color: Colors.black.withOpacity(0.3), + ), + ), + ), + // 表情选择器 + Positioned( + left: position.dx - 230.w, + top: position.dy - 60.sp, + child: Material( + color: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 气泡框 + Container( + width: 240.w, // 设置最大宽度,超出才会滚动 + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black26, + blurRadius: 10, + spreadRadius: 2, + ), + ], + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: emojis + .map((emoji) => Padding( + padding: + EdgeInsets.symmetric(horizontal: 4), + child: _emojiButton(emoji, id, list), + )) + .toList(), + ), + ), + ), + // 底部倒三角形 + ], + ), + )), + Positioned( + left: position.dx - 12.w, + top: position.dy - 18.w, + child: CustomPaint( + size: Size(20.w, 10.w), + painter: TrianglePainter(), + ), + ) + ], + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + } + + Widget _emojiButton(String emoji, int id, Lists list) { + return GestureDetector( + onTap: () async { + print("选择了表情: $emoji"); + _removeOverlay(); + isShowEmoji = false; + + int index = emojis.indexOf(emoji) + 1; + var result = await DioManager.instance.post( + url: Api.interactEmoji, params: {"calloutId": id, "type": index}); + if (result['code'] == 200) { + var data = await DioManager.instance + .get(url: Api.signCalloutDetail, params: { + 'id': id, + }); + if (data['code'] == 200) { + Lists bean = Lists.fromJson(data['data']); + index = lists.indexOf(list); + lists[index] = bean; + if (mounted) { + setState(() {}); + } + } + } + }, + child: Text( + emoji, + style: TextStyle(fontSize: 25), + ), + ); + } + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + } pushUserHome(String userId) async { if (widget.bean.is_limit && widget.bean.amount > 0) { await refreshCircleData(); } if (widget.bean.is_limit && widget.bean.amount > 0) { - Get.toNamed(Routes.UserInfoPage, arguments: userId,parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new','bean':jsonEncode({'id':widget.bean.id.toString(),'amount':widget.bean.amount.toString(),'oldAmount':widget.bean.oldAmount.toString(),'iosItem':widget.bean.ios_item})}); + Get.toNamed(Routes.UserInfoPage, arguments: userId, parameters: { + 'source': widget.index == 0 ? 'callout_list_hot' : 'callout_list_new', + 'bean': jsonEncode({ + 'id': widget.bean.id.toString(), + 'amount': widget.bean.amount.toString(), + 'oldAmount': widget.bean.oldAmount.toString(), + 'iosItem': widget.bean.ios_item + }) + }); // return; } else { - Get.toNamed(Routes.UserInfoPage, arguments: userId,parameters: {'source':widget.index == 0 ? 'callout_list_hot' : 'callout_list_new',}); + Get.toNamed(Routes.UserInfoPage, arguments: userId, parameters: { + 'source': widget.index == 0 ? 'callout_list_hot' : 'callout_list_new', + }); } - } circleWidget(String url, String userId, {double width = 24}) { @@ -3136,4 +3534,23 @@ class MySliverAppBarDelegate extends SliverPersistentHeaderDelegate { } } +// 自定义三角形 +class TrianglePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + var paint = Paint() + ..color = Colors.white + ..style = PaintingStyle.fill; + var path = Path(); + path.moveTo(0, 0); + path.lineTo(size.width / 2, size.height); + path.lineTo(size.width, 0); + path.close(); + + canvas.drawPath(path, paint); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; +} diff --git a/circle_app/lib/circle_app/help/view.dart b/circle_app/lib/circle_app/help/view.dart index fb097a0..135c95a 100644 --- a/circle_app/lib/circle_app/help/view.dart +++ b/circle_app/lib/circle_app/help/view.dart @@ -30,7 +30,7 @@ class HelpPage extends StatelessWidget { child: Scaffold( backgroundColor: Colors.transparent, appBar: MyAppBar( - centerTitle: '帮助与反馈', + centerTitle: '客服与反馈', actionWdiget: const Text( "我的反馈", style: TextStyle(color: Colors.white), diff --git a/circle_app/lib/circle_app/home/logic.dart b/circle_app/lib/circle_app/home/logic.dart index eabfd50..2e06388 100644 --- a/circle_app/lib/circle_app/home/logic.dart +++ b/circle_app/lib/circle_app/home/logic.dart @@ -86,6 +86,8 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { String inviteCode = ''; + String agentManualStr = ''; + var link = ''; @override void onClose() async { @@ -132,13 +134,13 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { addMsgListener(); - checkVersion(); + loadMyCircleData(); initWxApi(); awaitShowTodayDialog(); - awaitShowLikeRecomandDialog(); + // awaitShowLikeRecomandDialog(); } void addMsgListener() { @@ -572,7 +574,7 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { void onReady() async { // TODO: implement onReady super.onReady(); - + checkVersion(); FlutterNativeSplash.remove(); final logic = Get.find(); logic.loadCirclePeopleData(); @@ -803,7 +805,7 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { } void awaitShowTodayDialog() { - Future.delayed(Duration(seconds: 5), () async { + Future.delayed(Duration(seconds: 30), () async { SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); if (await sp.isFirstAutoMatch()) { var data = await DioManager.instance.get( @@ -859,6 +861,13 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { if (Get.currentRoute.contains(Routes.Chat) ) return; EventBusManager.fire(MsgTipClass(text, msgID, userInfo)); } + + loadManualata() async { + var data = await DioManager.instance.get(url: Api.agentManual); + if (data['code'] == 10000) { + agentManualStr = data['content']; + } + } } class conTop { diff --git a/circle_app/lib/circle_app/home/view.dart b/circle_app/lib/circle_app/home/view.dart index 48d1d72..0fdb08e 100644 --- a/circle_app/lib/circle_app/home/view.dart +++ b/circle_app/lib/circle_app/home/view.dart @@ -200,7 +200,7 @@ class _HomePageState extends State children: [ const CirclePage(), CircleListPage(), - WorldCallOutPage(), + WorldCallOutPage(), MsgPage(), MinefragmentPage() ], @@ -307,8 +307,9 @@ class _HomePageState extends State isSelected ? getTabbarImage('${image}_selected') : getTabbarImage('${image}_normal'), - width: 30.sp, - height: 30.sp, + width: 29.sp, + height: 29.sp, + fit: BoxFit.fill, excludeFromSemantics: true, gaplessPlayback: true, diff --git a/circle_app/lib/circle_app/invite/view.dart b/circle_app/lib/circle_app/invite/view.dart index 76351fd..8959e24 100644 --- a/circle_app/lib/circle_app/invite/view.dart +++ b/circle_app/lib/circle_app/invite/view.dart @@ -72,12 +72,11 @@ class _InvitePageState extends State child: Scaffold( backgroundColor: Colors.transparent, appBar: MyAppBar( - diyTitleWdiget: Container( width: Get.width, // color: Colors.red, child: Row( -mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, children: [ Theme( data: ThemeData( @@ -90,15 +89,15 @@ mainAxisAlignment: MainAxisAlignment.center, }, controller: _tabController, tabs: tabs, - labelPadding: EdgeInsets.only(left: 8.sp,right: 8.sp), - indicatorPadding: - EdgeInsets.only(left: 20.sp, right: 20.sp, bottom: 10.sp), + labelPadding: EdgeInsets.only(left: 8.sp, right: 8.sp), + indicatorPadding: EdgeInsets.only( + left: 20.sp, right: 20.sp, bottom: 10.sp), isScrollable: true, indicatorSize: TabBarIndicatorSize.label, labelColor: AppColor.mainColor, unselectedLabelColor: Color(0xCCF7FAFA), - labelStyle: - TextStyle(fontSize: 18.sp, fontWeight: FontWeight.w500), + labelStyle: TextStyle( + fontSize: 18.sp, fontWeight: FontWeight.w500), ), ), ], @@ -117,11 +116,36 @@ mainAxisAlignment: MainAxisAlignment.center, alignment: Alignment.center, height: 30.sp, // width: 62.sp, - child: Image.asset( - getMineImage('invite_right_icon'), - width: 62.sp, - fit: BoxFit.fill, - ), + child: Container( + height: 24.sp, + margin: EdgeInsets.all(0.6.sp), + padding: EdgeInsets.only( + left: 6.sp, + right: 6.sp, + ), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(17.0), + color: const Color(0xFF392D53), + border: GradientBoxBorder( + gradient: AppColor + .mainVerLinearGradient, + width: 1.sp, + ), + ), + child: Row( + children: [ + Text( + "邀请攻略", + style: TextStyle( + fontSize: 12.sp, + color: Colors.white, + ), + ), + ], + ), + ) ), ); }, @@ -725,8 +749,9 @@ mainAxisAlignment: MainAxisAlignment.center, height: 42.sp, margin: EdgeInsets.only(top: 35.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(21.sp), - gradient: AppColor.mainVerLinearGradient,), + borderRadius: BorderRadius.circular(21.sp), + gradient: AppColor.mainVerLinearGradient, + ), alignment: Alignment.center, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -734,10 +759,12 @@ mainAxisAlignment: MainAxisAlignment.center, Image( image: AssetImage(getMineImage("invite_icon")), // width: 22.sp, - height:22.sp, + height: 22.sp, color: Colors.white, ), - SizedBox(width: 4.sp,), + SizedBox( + width: 4.sp, + ), Text( '邀请圈友赚钱', style: TextStyle( @@ -774,26 +801,33 @@ mainAxisAlignment: MainAxisAlignment.center, Get.toNamed(Routes.Chat, arguments: con); }, child: Container( - width: 150.sp, - height: 42.sp, - margin: EdgeInsets.only(top: 35.sp), - decoration: BoxDecoration( + width: 150.sp, + height: 42.sp, + margin: EdgeInsets.only(top: 35.sp), + decoration: BoxDecoration( borderRadius: BorderRadius.circular(21.sp), - gradient: AppColor.mainVerLinearGradient,), - alignment: Alignment.center, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.perm_identity_outlined,size: 22.sp,color: Colors.white,), - SizedBox(width: 4.sp,), - Text( - homeLogic.inventStr.contains('赚') ? '联系客服结算' : '联系客服', - style: TextStyle( - color: Colors.white, - fontSize: 16, - fontWeight: FontWeight.w600), - ), - ])), + gradient: AppColor.mainVerLinearGradient, + ), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.perm_identity_outlined, + size: 22.sp, + color: Colors.white, + ), + SizedBox( + width: 4.sp, + ), + Text( + homeLogic.inventStr.contains('赚') ? '联系客服结算' : '联系客服', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w600), + ), + ])), ), ), ), @@ -801,8 +835,6 @@ mainAxisAlignment: MainAxisAlignment.center, ); } - - myTitileWidget() { return Container( height: 41.sp, @@ -922,7 +954,6 @@ mainAxisAlignment: MainAxisAlignment.center, ); } - buildSegment() { return Container( margin: EdgeInsets.only(top: 15.sp), @@ -1067,13 +1098,13 @@ titileWidget() { } rowWidget( - String str1, - String str2, - String str3, - String str4, - String str5, - String userId, - ) { + String str1, + String str2, + String str3, + String str4, + String str5, + String userId, +) { return Container( height: 41.sp, // margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), @@ -1137,8 +1168,6 @@ rowWidget( ); } - - infoText(String info, [Color color = const Color(0xFFF7FAFA)]) { return Center( child: Text( @@ -1268,7 +1297,6 @@ void showCodePicker(InviteLogic logic) { enableDrag: false); } - class InventDescItem extends StatefulWidget { const InventDescItem({super.key}); @@ -1292,15 +1320,15 @@ class _InventDescItemState extends State { Container( height: 42.sp, margin: - EdgeInsets.only(left: 0.sp, right: 0.sp, top: 10.sp), + EdgeInsets.only(left: 0.sp, right: 0.sp, top: 10.sp), decoration: BoxDecoration( color: Color(0xFF211C37), borderRadius: BorderRadius.circular(8.sp) - // image: DecorationImage( - // image: AssetImage(getMineImage("invite_sys_bg")), - // fit: BoxFit.fill, - // ), - ), + // image: DecorationImage( + // image: AssetImage(getMineImage("invite_sys_bg")), + // fit: BoxFit.fill, + // ), + ), child: Swiper( physics: NeverScrollableScrollPhysics(), autoplayDelay: 1500, @@ -1360,7 +1388,7 @@ class _InventDescItemState extends State { width: 100.sp, height: 50.sp, decoration: BoxDecoration( - color: AppColor.mainColor.withOpacity(0.35), + color: AppColor.mainColor.withOpacity(0.35), borderRadius: BorderRadius.circular(6.sp)), child: Stack( alignment: Alignment.center, @@ -1418,7 +1446,7 @@ class _InventDescItemState extends State { width: 100.sp, height: 50.sp, decoration: BoxDecoration( - color: AppColor.mainColor.withOpacity(0.35), + color: AppColor.mainColor.withOpacity(0.35), borderRadius: BorderRadius.circular(6.sp)), child: Stack( alignment: Alignment.center, @@ -1476,7 +1504,7 @@ class _InventDescItemState extends State { width: 100.sp, height: 50.sp, decoration: BoxDecoration( - color: AppColor.mainColor.withOpacity(0.35), + color: AppColor.mainColor.withOpacity(0.35), borderRadius: BorderRadius.circular(6.sp)), child: Stack( alignment: Alignment.center, @@ -1518,7 +1546,6 @@ class _InventDescItemState extends State { ], ), ), - SizedBox( height: 12.sp, ), @@ -1571,9 +1598,14 @@ class _InventDescItemState extends State { borderRadius: BorderRadius.circular(6.sp)), child: Column(children: [ Container( - margin: EdgeInsets.only(top: 12.sp), - child:Text('微乐园推广大使榜',style: TextStyle(color: AppColor.mainColor,fontSize: 15.sp,fontWeight: FontWeight.bold),) - ), + margin: EdgeInsets.only(top: 12.sp), + child: Text( + '微乐园推广大使榜', + style: TextStyle( + color: AppColor.mainColor, + fontSize: 15.sp, + fontWeight: FontWeight.bold), + )), Expanded( child: Container( margin: EdgeInsets.only( @@ -1582,52 +1614,48 @@ class _InventDescItemState extends State { decoration: BoxDecoration( color: Color(0x99363542), borderRadius: - BorderRadiusDirectional.circular(4.sp), + BorderRadiusDirectional.circular(4.sp), border: Border.all( color: Color(0x99363542), width: 1.sp)), child: logic.allInveiteData.isEmpty && - logic.selectedIndex == 1 + logic.selectedIndex == 1 ? noResultWidget() : ListView.builder( - // controller: logic.contentScrollController, - physics: NeverScrollableScrollPhysics(), - itemBuilder: - (BuildContext context, int index) { + // controller: logic.contentScrollController, + physics: NeverScrollableScrollPhysics(), + itemBuilder: + (BuildContext context, int index) { if (index == 0) { return titileWidget(); } - if (logic.allInveiteData - .length + - 1 == - index) { - return Container( - margin: EdgeInsets.only( - top: 4.sp, - left: 5.sp, - right: 5.sp), - child: Text( - '温馨提示:仅展示前${logic.allInveiteData.length}名,上榜的推广大使还能获得微乐园APP官方定制的精美礼品一份哦~', - style: TextStyle( - color: Colors.white - .withOpacity(0.75), - fontSize: 13.sp), - ), - ); + if (logic.allInveiteData.length + 1 == + index) { + return Container( + margin: EdgeInsets.only( + top: 4.sp, + left: 5.sp, + right: 5.sp), + child: Text( + '温馨提示:仅展示前${logic.allInveiteData.length}名,上榜的推广大使还能获得微乐园APP官方定制的精美礼品一份哦~', + style: TextStyle( + color: Colors.white + .withOpacity(0.75), + fontSize: 13.sp), + ), + ); } - var data = logic - .allInveiteData[index - 1]; + var data = + logic.allInveiteData[index - 1]; return rowWidget( - data['nickname'], - data['inviteCount'] - .toString(), - data['vipDaysStr'] - .toString() + - '天', - '${data['directProfitStr']}票', - '${data['rebateStr']}票', - data['userId'].toString()); + data['nickname'], + data['inviteCount'].toString(), + data['vipDaysStr'].toString() + '天', + '${data['directProfitStr']}票', + '${data['rebateStr']}票', + data['userId'].toString()); }, - itemCount: logic.allInveiteData.length + 2))), + itemCount: + logic.allInveiteData.length + 2))), ])), SizedBox( height: 60.sp + MediaQuery.of(context).padding.bottom, @@ -1658,69 +1686,75 @@ class _InventDescItemState extends State { decoration: BoxDecoration( gradient: AppColor.mainVerLinearGradient, borderRadius: BorderRadius.circular(21.sp)), - child: - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image( - image: AssetImage(getMineImage("invite_icon")), - // width: 22.sp, - height:22.sp, - color: Colors.white, - ), - SizedBox(width: 4.sp,), - Text( - '邀请圈友赚钱', - style: - TextStyle(color: Colors.white, fontSize: 15.sp), - ), - ], + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMineImage("invite_icon")), + // width: 22.sp, + height: 22.sp, + color: Colors.white, ), + SizedBox( + width: 4.sp, + ), + Text( + '邀请圈友赚钱', + style: + TextStyle(color: Colors.white, fontSize: 15.sp), + ), + ], + ), ), ), // if (logic.isShow) - GestureDetector( - onTap: () { - logic.sendApply(); - var con; - if (kDebugMode) { - con = V2TimConversation( - conversationID: "c2c_qpqz_dev_10_102", - userID: "qpqz_dev_10_102", - showName: "测试乐园客服", - type: 1); - } else { - con = V2TimConversation( - conversationID: "c2c_qpqz_prod_10_102", - userID: "qpqz_prod_10_102", - showName: "乐园客服", - type: 1); - } - Get.toNamed(Routes.Chat, arguments: con); - }, - child: Container( - alignment: Alignment.center, - width: 150.sp, - height: 42.sp, - decoration: BoxDecoration( - gradient: AppColor.mainVerLinearGradient, - borderRadius: BorderRadius.circular(21.sp), - ), - child: - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.stars,size: 22.sp,color: Colors.white,), - SizedBox(width: 4.sp,), - Text( - '申请成为大使', - style: TextStyle( - color: Colors.white, fontSize: 15.sp), - ), - ], - ), + GestureDetector( + onTap: () { + logic.sendApply(); + var con; + if (kDebugMode) { + con = V2TimConversation( + conversationID: "c2c_qpqz_dev_10_102", + userID: "qpqz_dev_10_102", + showName: "测试乐园客服", + type: 1); + } else { + con = V2TimConversation( + conversationID: "c2c_qpqz_prod_10_102", + userID: "qpqz_prod_10_102", + showName: "乐园客服", + type: 1); + } + Get.toNamed(Routes.Chat, arguments: con); + }, + child: Container( + alignment: Alignment.center, + width: 150.sp, + height: 42.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(21.sp), ), - ) + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.stars, + size: 22.sp, + color: Colors.white, + ), + SizedBox( + width: 4.sp, + ), + Text( + '申请成为大使', + style: + TextStyle(color: Colors.white, fontSize: 15.sp), + ), + ], + ), + ), + ) ], ), )) @@ -1757,7 +1791,7 @@ class _InventDescItemState extends State { ], ), Container( - margin: EdgeInsets.only(left: 10.sp, top: 10.sp,right: 10.sp), + margin: EdgeInsets.only(left: 10.sp, top: 10.sp, right: 10.sp), child: Text( desc, style: TextStyle( @@ -1831,12 +1865,12 @@ class _InventDescItemState extends State { } myRowWidget( - String str1, - String str2, - String str3, - String str4, - String userId, - ) { + String str1, + String str2, + String str3, + String str4, + String userId, + ) { return Container( height: 41.sp, // margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), @@ -1898,4 +1932,3 @@ class _InventDescItemState extends State { isScrollControlled: true, enableDrag: false); } } - diff --git a/circle_app/lib/circle_app/login/login/logic.dart b/circle_app/lib/circle_app/login/login/logic.dart index 38904d1..1f26404 100644 --- a/circle_app/lib/circle_app/login/login/logic.dart +++ b/circle_app/lib/circle_app/login/login/logic.dart @@ -61,7 +61,7 @@ class LoginLogic extends GetxController { } - if (sharedPreferences!.containsKey(SharedPreferencesHelper.firstLogin)) { + if (sharedPreferences!.containsKey(SharedPreferencesHelper.firstLogin) && pwd.isNotEmpty) { loginType = 1; pwdEditingController.text = pwd; } diff --git a/circle_app/lib/circle_app/minefragment/logic.dart b/circle_app/lib/circle_app/minefragment/logic.dart index 12e8eff..ca7c73b 100644 --- a/circle_app/lib/circle_app/minefragment/logic.dart +++ b/circle_app/lib/circle_app/minefragment/logic.dart @@ -78,6 +78,8 @@ class MinefragmentLogic extends GetxController { AssetsDataData? myAssest; + bool isShowserveTip = false; + @override void onReady() { // TODO: implement onReady @@ -94,6 +96,9 @@ class MinefragmentLogic extends GetxController { } else { isProxy = false; } + + isShowserveTip = sp.getBool(SharedPreferencesHelper.serveTip) ?? true; + loadRelationTypeFirstListData(); checkShowPositiveFeedBack(); getMode(); @@ -109,6 +114,10 @@ class MinefragmentLogic extends GetxController { loadDyanmicListData(); } + setSpServeTip() async { + SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); + sp.setBool(SharedPreferencesHelper.serveTip, false); + } loadData() { getMode(); @@ -209,7 +218,7 @@ class MinefragmentLogic extends GetxController { var data = await DioManager.instance.get(url: Api.getVisitorMsgs,); if (data['code'] == 200) { - recent_visit_count_new = data['data']['unreadCount'] ?? 0; + recent_visit_count_new = data['data']['newVisitorCount'] ?? 0; } update(); } diff --git a/circle_app/lib/circle_app/minefragment/mine_func_item.dart b/circle_app/lib/circle_app/minefragment/mine_func_item.dart index 30a0916..035f5c3 100644 --- a/circle_app/lib/circle_app/minefragment/mine_func_item.dart +++ b/circle_app/lib/circle_app/minefragment/mine_func_item.dart @@ -524,7 +524,7 @@ class _MineFuncItemState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '帮助与反馈', + '客服与反馈', style: TextStyle(color: Colors.white,fontSize: 14.sp), ), SizedBox(width: 4.sp), diff --git a/circle_app/lib/circle_app/minefragment/view.dart b/circle_app/lib/circle_app/minefragment/view.dart index 2e7ec47..0f776c2 100644 --- a/circle_app/lib/circle_app/minefragment/view.dart +++ b/circle_app/lib/circle_app/minefragment/view.dart @@ -257,8 +257,9 @@ class _MinefragmentPageState extends State ), ), GestureDetector( - onTap:() { - Get.toNamed(Routes.GiftShopPage,arguments: ''); + onTap: () { + Get.toNamed(Routes.GiftShopPage, + arguments: ''); }, child: Container( height: 18.sp, @@ -314,7 +315,9 @@ class _MinefragmentPageState extends State alignment: Alignment.center, height: 22.sp, child: Text( - (logic.myInfoBean?.contact?.isEmpty ?? true) ? '填写微信赚钱': '设置联系方式', + (logic.myInfoBean?.contact?.isEmpty ?? true) + ? '填写微信赚钱' + : '设置联系方式', style: TextStyle( color: Colors.white, fontSize: 13.sp), ), @@ -367,31 +370,85 @@ class _MinefragmentPageState extends State isShowMenu = false; logic.update(); }), - Positioned(bottom: 20.sp,right: 15.sp,child: InkWell( - onTap: () { - Get.toNamed(Routes.HelpPage); - }, - child: Container( - height: 50.sp, - width: 50.sp, - decoration: BoxDecoration( - gradient: AppColor.mainVerLinearGradient, - borderRadius: BorderRadius.circular(25.sp) - ), + if (logic.isShowserveTip) + Positioned( + child: Container( + width: Get.width, + height: Get.height, + color: Colors.black.withOpacity(0.7), + child: Stack( + children: [ + Positioned( + bottom: 130.sp, + right: 30.sp, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getMineImage('bubble_icon'), + width: 174.sp, + ), + Container(margin: EdgeInsets.only(bottom: 10.sp),child: Text('产品反馈或在线客服',style: TextStyle(color: Colors.white,fontSize: 16.sp,fontWeight: FontWeight.bold),)) + ], + )), + Positioned( + bottom: 95.sp, + right: 40.sp, + child: Image.asset( + getMineImage('hand_icon'), + width: 32.sp, + )), + ], + ), + )), + Positioned( + bottom: 20.sp, + right: 15.sp, + child: InkWell( + onTap: () { + Get.toNamed(Routes.HelpPage); + logic.isShowserveTip = false; + logic.setSpServeTip(); + logic.update(); + }, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Image.asset( - getMineImage('cs_icon'), - width: 40.sp, - height: 40.sp, - color: Colors.white, + Container( + height: 50.sp, + width: 50.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(25.sp)), + child: Center( + child: Image.asset( + getMineImage('cs_icon'), + width: 40.sp, + height: 40.sp, + color: Colors.white, + ), + ), ), + Container( + margin: EdgeInsets.only(top: 4.sp), + child: Text( + '客服与反馈', + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(0.0, -1)) + ] + ), + )) ], ), ), - ),) + ), ], ); } @@ -484,7 +541,8 @@ class _MinefragmentPageState extends State child: Container( height: 22.sp, alignment: Alignment.center, - padding: EdgeInsets.only(left: 5.sp, right: 5.sp), + padding: + EdgeInsets.only(left: 5.sp, right: 5.sp), decoration: BoxDecoration( color: AppColor.mainBgColor, borderRadius: BorderRadius.circular(4.sp)), @@ -524,15 +582,14 @@ class _MinefragmentPageState extends State ), ), if ((logic.userInfoBean?.mark ?? 0) > 0) - SizedBox(width: 8.sp), + SizedBox(width: 8.sp), if ((logic.userInfoBean?.mark ?? 0) > 0) - UserTagWidget(logic.userInfoBean!.mark!), - if (logic.isAuth) - SizedBox(width: 4.sp), + UserTagWidget(logic.userInfoBean!.mark!), + if (logic.isAuth) SizedBox(width: 4.sp), if (logic.isAuth) Image( image: AssetImage(getMineImage("auth")), - height:18.sp, + height: 18.sp, ), ], ), @@ -581,11 +638,11 @@ class _MinefragmentPageState extends State ), ), if (interests.isNotEmpty) - Container( - height: 50.sp, - margin: EdgeInsets.only(top: 10.sp, left: 10.sp, right: 10.sp), - child: _buildInterestsListView(interests), - ), + Container( + height: 50.sp, + margin: EdgeInsets.only(top: 10.sp, left: 10.sp, right: 10.sp), + child: _buildInterestsListView(interests), + ), _friendsRow(logic), Container( height: 70.sp, @@ -826,35 +883,35 @@ class _MinefragmentPageState extends State ), ) : GestureDetector( - onTap: () { - showTimeRecordDialog(logic.myInfoBean!); - }, - child: Container( - margin: EdgeInsets.only(left: 10.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), - gradient: const LinearGradient( - colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - padding: EdgeInsets.symmetric( - vertical: 2.sp, - horizontal: 12.sp, - ), - child: Text( - '记录时光', - style: const TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ), + onTap: () { + showTimeRecordDialog(logic.myInfoBean!); + }, + child: Container( + margin: EdgeInsets.only(left: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.symmetric( + vertical: 2.sp, + horizontal: 12.sp, + ), + child: Text( + '记录时光', + style: const TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), ], ), ); @@ -871,7 +928,7 @@ class _MinefragmentPageState extends State ), ), child: Container( - margin: EdgeInsets.only(left: 24.sp,right: 5.sp), + margin: EdgeInsets.only(left: 24.sp, right: 5.sp), child: Center( child: Text( controller.userInfoBean != null @@ -2496,7 +2553,6 @@ class _MinefragmentPageState extends State ), ), ), - if (logic.userInfoBean?.avatarNonhuman == 0) Positioned( bottom: 0, diff --git a/circle_app/lib/circle_app/msg/logic.dart b/circle_app/lib/circle_app/msg/logic.dart index 896b32f..5576929 100644 --- a/circle_app/lib/circle_app/msg/logic.dart +++ b/circle_app/lib/circle_app/msg/logic.dart @@ -38,6 +38,8 @@ class MsgLogic extends GetxController { List visitorMsgs = []; List bannerList = []; + bool isMsgCountLoad = false; + @override void onInit() { // TODO: implement onInit @@ -200,6 +202,8 @@ class MsgLogic extends GetxController { } void getVisitorMsgsData() async { + if (isMsgCountLoad) return; + isMsgCountLoad = true; var data = await DioManager.getInstance().get(url: Api.getVisitorMsgs); if (data["code"] == 200) { @@ -208,6 +212,7 @@ class MsgLogic extends GetxController { await loadVisitorTotalData(); await loadInterestedInMeUsersData(); } + isMsgCountLoad = false; update(); } diff --git a/circle_app/lib/circle_app/msg/sys_notify_list/view.dart b/circle_app/lib/circle_app/msg/sys_notify_list/view.dart index b01e964..b42ac5a 100644 --- a/circle_app/lib/circle_app/msg/sys_notify_list/view.dart +++ b/circle_app/lib/circle_app/msg/sys_notify_list/view.dart @@ -209,7 +209,7 @@ class Sys_notify_listPage extends StatelessWidget { width: 20.sp, ), Text( - '帮助与反馈', + '客服与反馈', style: TextStyle( color: Colors.white, fontSize: 15.sp), @@ -371,7 +371,7 @@ class Sys_notify_listPage extends StatelessWidget { Text( info['ta']['nickname'] ?? '', style: const TextStyle( - color: Colors.white70, + color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold), ), @@ -392,7 +392,7 @@ class Sys_notify_listPage extends StatelessWidget { child: Text( info['msg'], style: - TextStyle(color: Colors.white54, fontSize: 14.sp), + TextStyle(color: Colors.white, fontSize: 14.sp), ), ), SizedBox( diff --git a/circle_app/lib/circle_app/quick/logic.dart b/circle_app/lib/circle_app/quick/logic.dart index 187eaed..038d4ab 100644 --- a/circle_app/lib/circle_app/quick/logic.dart +++ b/circle_app/lib/circle_app/quick/logic.dart @@ -126,7 +126,7 @@ class QuickLogic extends GetxController { var data = await DioManager.instance.post(url: Api.queryQuickChatUserV2, params: { 'page': type == 1 ? page : page1, - 'pageSize': 20, + 'pageSize': 10, 'sortType': type, 'wantMeet': wantMeet, "lat": position?.latitude ?? 0, diff --git a/circle_app/lib/commons/widgets/online_recommand_dialog.dart b/circle_app/lib/commons/widgets/online_recommand_dialog.dart index 73e2e29..aa7e846 100644 --- a/circle_app/lib/commons/widgets/online_recommand_dialog.dart +++ b/circle_app/lib/commons/widgets/online_recommand_dialog.dart @@ -55,7 +55,7 @@ class _OnlineRecommandDialogState extends State { decoration: BoxDecoration( color: AppColor.bgColor, borderRadius: BorderRadius.circular(10.sp)), - margin: EdgeInsets.only(left: 30.sp, right: 30.sp), + margin: EdgeInsets.only(left: widget.userList.length == 3 ? 5 : 30.sp, right: widget.userList.length == 3 ? 5 : 15.sp), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -322,6 +322,7 @@ class _OnlineRecommandDialogState extends State { Container( margin: EdgeInsets.only( left: 4.sp, + top: 4.sp, ), child: Image.asset( getCircleImage(item.vip == 1 ? 'vip' : 'year_vip'), diff --git a/circle_app/lib/commons/widgets/unlock_wx_tip.dart b/circle_app/lib/commons/widgets/unlock_wx_tip.dart index b82d05c..0c2dd77 100644 --- a/circle_app/lib/commons/widgets/unlock_wx_tip.dart +++ b/circle_app/lib/commons/widgets/unlock_wx_tip.dart @@ -58,7 +58,7 @@ class _UnlockWxTipState extends State { Container( margin: EdgeInsets.only(left: 20.sp, right: 20.sp), padding: EdgeInsets.all(15.sp), - height: Platform.isAndroid ? (!widget.isMore ? 230.sp : 460.sp) : (!widget.isMore ? 190.sp :430.sp) , + height: Platform.isAndroid ? (!widget.isMore ? 190.sp : 310.sp + (prices.length > 0 ? prices.length * 50.sp - 50.sp : 0.sp)) : (!widget.isMore ? 190.sp :280.sp + (prices.length > 0 ? prices.length * 50.sp - 50.sp : 0.sp)) , // 460.sp : 430.sp, decoration: BoxDecoration( color: const Color(0xFF393949), @@ -129,7 +129,7 @@ class _UnlockWxTipState extends State { ), ), // SizedBox(height: 20.0.sp), - if (Platform.isAndroid) + if (Platform.isAndroid && widget.isMore) Container( margin: EdgeInsets.only(top: 0.sp, bottom: 20.sp), child: Row( @@ -437,8 +437,17 @@ class _UnlockWxTipState extends State { var data = Autogenerated.fromJson(result); if (data.prices != null) { prices = data.prices!; - - + if (wxInfo['price'] != null) { + List pricesList = []; + pricesList.add(prices.first); + prices.forEach((element) { + print('当前价格:${element.curPrice!} 需支付价格:${wxInfo['price'] * 0.01}'); + if (element.curPrice! > wxInfo['price'] * 0.01 && !pricesList.contains(element)) { + pricesList.add(element); + } + }); + prices = pricesList; + } } } if (mounted) { @@ -468,7 +477,7 @@ class _UnlockWxTipState extends State { Get.back(result: 1); } else { showOKToast(result['msg']); - if (result['code'] == 10081) { + if (result['code'] == 10081 || result['code'] == 31201) { showRechargeScreenDialog('unlock_contact'); } } diff --git a/circle_app/lib/commons/widgets/wx_edit_dialog.dart b/circle_app/lib/commons/widgets/wx_edit_dialog.dart index 555bf1d..8d470de 100644 --- a/circle_app/lib/commons/widgets/wx_edit_dialog.dart +++ b/circle_app/lib/commons/widgets/wx_edit_dialog.dart @@ -16,9 +16,9 @@ import '../../../utils/util.dart'; class WxEditDialog extends StatefulWidget { String phone; - WxEditDialog(this.phone,{super.key}); + WxEditDialog(this.phone, {super.key}); @override - _WxEditDialogState createState() => _WxEditDialogState(); + _WxEditDialogState createState() => _WxEditDialogState(); } class _WxEditDialogState extends State { @@ -33,10 +33,13 @@ class _WxEditDialogState extends State { Map wxStatusInfo = {}; + String content = ''; + @override void initState() { // TODO: implement initState super.initState(); + loadDescData(); loadMyWxInfoData(); loadWxStatus(); // updateWxText(); @@ -58,8 +61,8 @@ class _WxEditDialogState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - padding: EdgeInsets.only(left: 15.sp,right: 15.sp), - height: 455.sp, + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + height: 520.sp, margin: EdgeInsets.only(left: 15.sp, right: 15.sp), decoration: BoxDecoration( image: DecorationImage( @@ -81,7 +84,7 @@ class _WxEditDialogState extends State { child: Text( '联系方式设置', style: TextStyle( - // color: AppColor.mainColor, + // color: AppColor.mainColor, color: Colors.white, fontSize: 18.sp, shadows: const [ @@ -92,7 +95,7 @@ class _WxEditDialogState extends State { ), )), Container( - margin: EdgeInsets.only(bottom: 10.sp,top: 15.sp), + margin: EdgeInsets.only(bottom: 10.sp, top: 15.sp), // height: 30.sp, child: Row( children: [ @@ -104,75 +107,86 @@ class _WxEditDialogState extends State { child: Row( children: [ Image.asset( - getMineImage(type == 1 ? 'phone_icon' : type == 3 ? 'qq' : 'wx'), + getMineImage(type == 1 + ? 'phone_icon' + : type == 3 + ? 'qq' + : 'wx'), width: 40.sp, ), Container( - margin: EdgeInsets.only(left: 4.sp,right: 4.sp), - child: Icon(Icons.change_circle,color: AppColor.mainColor,size: 30.sp,)), + margin: EdgeInsets.only( + left: 4.sp, right: 4.sp), + child: Icon( + Icons.change_circle, + color: AppColor.mainColor, + size: 30.sp, + )), ], ), ), ), - Expanded(child: Container( + Expanded( + child: Container( margin: EdgeInsets.only(right: 15.sp), decoration: BoxDecoration( color: Color(0xFF260C3E), borderRadius: BorderRadius.circular(10.sp), border: GradientBoxBorder( - gradient: - AppColor.mainVerLinearGradient, + gradient: AppColor.mainVerLinearGradient, width: 1.sp, ), ), child: TextField( - controller: - wxEditingController, + controller: wxEditingController, maxLength: 20, style: TextStyle( - color: Colors.white, - fontSize: 16.sp), + color: Colors.white, fontSize: 16.sp), decoration: InputDecoration( hintText: '请输入真实的联系方式', hintStyle: TextStyle( - color: Colors.white70, - fontSize: 14.sp), + color: Colors.white70, fontSize: 14.sp), border: InputBorder.none, counterText: '', - contentPadding: - EdgeInsets.only( - left: 14.sp)), + contentPadding: EdgeInsets.only(left: 14.sp)), ), )), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (wxInfo.containsKey('hideContact')) { - wxInfo['hideContact'] = wxInfo['hideContact'] == 0 ? 1 : 0; - - } else { - wxInfo['hideContact'] = 0; - - } - showOKToast(wxInfo['hideContact'] == 1 ? '已对其他人隐藏联系方式' : '已对其他人展示联系方式(需要解锁)'); - setState(() { - - }); - - }, + behavior: HitTestBehavior.opaque, + onTap: () { + if (wxInfo.containsKey('hideContact')) { + wxInfo['hideContact'] = + wxInfo['hideContact'] == 0 ? 1 : 0; + } else { + wxInfo['hideContact'] = 0; + } + showOKToast(wxInfo['hideContact'] == 1 + ? '已对其他人隐藏联系方式' + : '已对其他人展示联系方式(需要解锁)'); + setState(() {}); + }, child: Column( children: [ - Image.asset(getMineImage(wxInfo.containsKey('hideContact') ? wxInfo['hideContact'] == 1 ? 'no_show_icon' : 'show_icon' : 'show_icon'),width: 30.sp,), + Image.asset( + getMineImage( + wxInfo.containsKey('hideContact') + ? wxInfo['hideContact'] == 1 + ? 'no_show_icon' + : 'show_icon' + : 'show_icon'), + width: 30.sp, + ), //已隐藏 显示中 Text( wxInfo.containsKey('hideContact') ? wxInfo['hideContact'] == 1 - ? '已隐藏' - : '显示中' + ? '已隐藏' + : '显示中' : '显示中', style: TextStyle( - color: Color(0xCCFFFFFF).withOpacity(0.5), fontSize: 14.sp), + color: + Color(0xCCFFFFFF).withOpacity(0.5), + fontSize: 14.sp), ) ], )) @@ -185,31 +199,23 @@ class _WxEditDialogState extends State { color: Color(0xFF260C3E), borderRadius: BorderRadius.circular(10.sp), border: GradientBoxBorder( - gradient: - AppColor.mainVerLinearGradient, + gradient: AppColor.mainVerLinearGradient, width: 1.sp, ), ), - child: TextField( - controller: - descEditingController, + child: TextField( + controller: descEditingController, maxLength: 30, - style: TextStyle( - color: Colors.white, - fontSize: 16.sp), + style: TextStyle(color: Colors.white, fontSize: 16.sp), // keyboardType: TextInputType.phone, decoration: InputDecoration( hintText: '请输入解锁引导语', hintStyle: TextStyle( - color: Colors.white70, - fontSize: 14.sp), + color: Colors.white70, fontSize: 14.sp), border: InputBorder.none, counterText: '', - contentPadding: - EdgeInsets.only( - left: 14.sp)), + contentPadding: EdgeInsets.only(left: 14.sp)), ), - ), Container( margin: EdgeInsets.only(top: 10.sp), @@ -220,13 +226,19 @@ class _WxEditDialogState extends State { width: 18.sp, height: 18.sp, ), - SizedBox(width: 2.sp,), - Text('设置解锁价格',style: TextStyle(color: Color(0xCCFFFFFF),fontSize: 14.sp),), + SizedBox( + width: 2.sp, + ), + Text( + '设置解锁价格', + style: TextStyle( + color: Color(0xCCFFFFFF), fontSize: 14.sp), + ), SizedBox( width: 60.sp, height: 30.sp, child: Container( - margin: EdgeInsets.only(left: 5.sp,right: 5.sp), + margin: EdgeInsets.only(left: 5.sp, right: 5.sp), decoration: BoxDecoration( color: Color(0xFF260C3E), borderRadius: BorderRadius.circular(10.sp), @@ -238,20 +250,17 @@ class _WxEditDialogState extends State { ), child: Row( children: [ - Expanded(child: TextField( - controller: - moneyEditingController, + Expanded( + child: TextField( + controller: moneyEditingController, maxLength: 4, textAlign: TextAlign.center, style: TextStyle( - color: Colors.white, - fontSize: 14.sp), + color: Colors.white, fontSize: 14.sp), keyboardType: TextInputType.phone, inputFormatters: [ - FilteringTextInputFormatter - .digitsOnly, + FilteringTextInputFormatter.digitsOnly, ], - decoration: InputDecoration( hintText: '', isCollapsed: true, @@ -260,31 +269,39 @@ class _WxEditDialogState extends State { fontSize: 14.sp), border: InputBorder.none, counterText: '', - contentPadding: - EdgeInsets.only( - left: 6.sp,right: 6.sp,bottom: 0,top: 0)), + contentPadding: EdgeInsets.only( + left: 6.sp, + right: 6.sp, + bottom: 0, + top: 0)), )) ], ), - ), ), - Text('元',style: TextStyle(color: Color(0xCCFFFFFF),fontSize: 14.sp),), Text( - '(解锁收益都归您)', + '元', style: TextStyle( - color: Color(0xCCFFFFFF).withOpacity(0.5), fontSize: 14.sp), + color: Color(0xCCFFFFFF), fontSize: 14.sp), + ), + Text( + '(可填10-520)', + style: TextStyle( + color: Color(0xCCFFFFFF).withOpacity(0.5), + fontSize: 14.sp), ) ], ), ), Container( margin: EdgeInsets.only(top: 10.sp), - child: Text('温馨提示:\n' - + '1、为了维护站内的社交环境,若检测到为不实的联系方式,或以非社交为目的的其他非法用途,会第一时间将您账号封禁,并扣除相关奖励;\n' - + '2、解锁引导语可以让更多的人愿意解锁您的联系方式,让您赚更多的钱;\n' - + '3、每个人解锁后,您都可以得到设置价格的钱,收益无上限哦;\n' - + '4、此外,还可获得几重奖励。',style: TextStyle(color: Color(0xCCFFFFFF).withOpacity(0.5),fontSize: 14.sp),), + child: Text( + '温馨提示:\n' + '${content}', + style: TextStyle( + height: 1.5, + color: Color(0xCCFFFFFF).withOpacity(0.5), + fontSize: 14.sp), + ), ), Container( margin: EdgeInsets.only(top: 10.sp), @@ -299,7 +316,8 @@ class _WxEditDialogState extends State { height: 30.sp, width: 100.sp, alignment: Alignment.center, - padding: EdgeInsets.only(left: 10.sp, right: 10.sp), + padding: + EdgeInsets.only(left: 10.sp, right: 10.sp), margin: EdgeInsets.only(bottom: 10.sp), decoration: BoxDecoration( color: Colors.grey.withOpacity(0.7), @@ -320,12 +338,16 @@ class _WxEditDialogState extends State { if (wxEditingController.text.length == 11) { RegExp exp = RegExp( r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$'); - isPass = exp.hasMatch(wxEditingController.text); + isPass = + exp.hasMatch(wxEditingController.text); } - if (wxEditingController.text.isNotEmpty && !isPass) { - RegExp wxReg = RegExp(r'^[-_a-zA-Z][-_a-zA-Z0-9]{5,19}$'); - if (!wxReg.hasMatch(wxEditingController.text)) { + if (wxEditingController.text.isNotEmpty && + !isPass) { + RegExp wxReg = RegExp( + r'^[-_a-zA-Z][-_a-zA-Z0-9]{5,19}$'); + if (!wxReg + .hasMatch(wxEditingController.text)) { showOKToast('请输入正确的微信号'); return; } @@ -340,7 +362,8 @@ class _WxEditDialogState extends State { if (wxEditingController.text.length == 11) { RegExp exp = RegExp( r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$'); - isPass = exp.hasMatch(wxEditingController.text); + isPass = + exp.hasMatch(wxEditingController.text); } if (!isPass) { showOKToast('请输入正确的手机号'); @@ -348,37 +371,42 @@ class _WxEditDialogState extends State { } } - if (moneyEditingController.text.isNotEmpty) { - if (int.parse(moneyEditingController.text) <= 0) { + if (int.parse(moneyEditingController.text) <= + 0) { showOKToast('请设置联系方式解锁金额大于零'); return; - } else if (int.parse(moneyEditingController.text) > 300 || int.parse(moneyEditingController.text) < 10) { - showOKToast('请设置联系方式解锁金额在10元~300元之间'); + } else if (int.parse( + moneyEditingController.text) > + 520 || + int.parse(moneyEditingController.text) < + 10) { + showOKToast('请填写解锁金额在10元-520元之间'); return; } } - - if (wxInfo.containsKey('10034')) { showOKToast(wxInfo['10034']); return; } else if (wxInfo.containsKey('10595')) { showOKToast(wxInfo['10595']); } - Map params = { "guideText": descEditingController.text, - "hideContact": wxInfo.containsKey('hideContact') ? wxInfo['hideContact'] : 0, - - 'contactType':type, - "contact": wxEditingController.text}; + Map params = { + "guideText": descEditingController.text, + "hideContact": wxInfo.containsKey('hideContact') + ? wxInfo['hideContact'] + : 0, + 'contactType': type, + "contact": wxEditingController.text + }; if (moneyEditingController.text.isNotEmpty) { params['price'] = moneyEditingController.text; } - - var result = await DioManager().postBody(url: Api.confset,params: params); + var result = await DioManager() + .postBody(url: Api.confset, params: params); if (result['code'] == 200) { showOKToast('已设置成功,快去邀请圈友解锁呗~'); Get.back(); @@ -390,13 +418,13 @@ class _WxEditDialogState extends State { height: 30.sp, width: 100.sp, alignment: Alignment.center, - padding: EdgeInsets.only(left: 10.sp, right: 10.sp), + padding: + EdgeInsets.only(left: 10.sp, right: 10.sp), margin: EdgeInsets.only(bottom: 10.sp), decoration: BoxDecoration( - // color: const Color(0xFFFF4D7C), - borderRadius: BorderRadius.circular(20), - gradient: AppColor.mainVerLinearGradient - ), + // color: const Color(0xFFFF4D7C), + borderRadius: BorderRadius.circular(20), + gradient: AppColor.mainVerLinearGradient), child: Text( '确认', style: TextStyle( @@ -408,7 +436,6 @@ class _WxEditDialogState extends State { ], ), ), - ], ), ), @@ -432,20 +459,21 @@ class _WxEditDialogState extends State { void updateWxText() async { if (widget.phone.isNotEmpty) { - SharedPreferences sharedPreferences =await SharedPreferences.getInstance(); - String loginPhone = await sharedPreferences.getString(SharedPreferencesHelper.LOGINPHONE)??""; + SharedPreferences sharedPreferences = + await SharedPreferences.getInstance(); + String loginPhone = await sharedPreferences + .getString(SharedPreferencesHelper.LOGINPHONE) ?? + ""; wxEditingController.text = loginPhone; type = 1; wxInfo['hideContact'] = 0; - setState(() { - - }); + setState(() {}); } } void loadMyWxInfoData() async { var data = - await DioManager.instance.get(url: Api.mycontactConf, params: {}); + await DioManager.instance.get(url: Api.mycontactConf, params: {}); if (data['code'] == 200) { wxInfo = data['data']; @@ -454,18 +482,20 @@ class _WxEditDialogState extends State { } else { wxEditingController.text = wxInfo['contact'] ?? ''; type = wxInfo['contactType'] ?? 2; - wxInfo['hideContact'] = wxInfo['hideContact'] == null ? 0 : wxInfo['hideContact']; + wxInfo['hideContact'] = + wxInfo['hideContact'] == null ? 0 : wxInfo['hideContact']; descEditingController.text = wxInfo['guideText'] ?? ''; - moneyEditingController.text = wxInfo['price'] != null ? wxInfo['price'].toString() : ''; - setState(() { - - }); + moneyEditingController.text = + wxInfo['price'] != null ? wxInfo['price'].toString() : ''; + setState(() {}); } } } void loadWxStatus() async { - var result = await DioManager.getInstance().get(url: Api.updateWxNumState,); + var result = await DioManager.getInstance().get( + url: Api.updateWxNumState, + ); if (result['code'] == 10034) { wxInfo['10034'] = result['msg']; } else if (result['code'] == 10595) { @@ -487,9 +517,7 @@ class _WxEditDialogState extends State { onPressed: () { Navigator.pop(context); type = 1; - setState(() { - - }); + setState(() {}); }, child: Text('手机号'), ), @@ -497,9 +525,7 @@ class _WxEditDialogState extends State { onPressed: () { Navigator.pop(context); type = 3; - setState(() { - - }); + setState(() {}); }, child: Text('QQ'), ), @@ -507,9 +533,7 @@ class _WxEditDialogState extends State { onPressed: () { Navigator.pop(context); type = 2; - setState(() { - - }); + setState(() {}); }, child: Text('微信'), ), @@ -525,4 +549,13 @@ class _WxEditDialogState extends State { isScrollControlled: true); } + void loadDescData() async { + var data = await DioManager.instance.get(url: Api.contactGuide,); + if (data['code'] == 10000) { + content = data['content']; + if (mounted) { + setState(() {}); + } + } + } } diff --git a/circle_app/lib/net/api.dart b/circle_app/lib/net/api.dart index f4a6697..9a78235 100644 --- a/circle_app/lib/net/api.dart +++ b/circle_app/lib/net/api.dart @@ -379,7 +379,7 @@ class Api { static const wahtWxNum = '/user-service/user/updateWxNum/notice/'; //小票解锁微信 - static const balanceUnlockWX = '/user-service/contact/unlock/balance'; + static const balanceUnlockWX = '/user-service/contact/unlock/balanceV2'; //获取用户解锁微信号设置信息 static const wxNumConfig = '/user-service/contact/user/conf/get/'; @@ -683,5 +683,23 @@ class Api { //单个喊话详情 static var signCalloutDetail = '/up-service/callout/id'; - + + //联系方式弹窗引导文案 + static var contactGuide = '/user-service/content/popup/contact/guide'; + + //喊话互动 + static var interactEmoji = '/up-service/callout/interact/emoji'; + + //圈子代理人说明 + static var agentManual = '/user-service/content/popup/interest/agent/manual'; + + //代理人权益 + static var agentRights = '/user-service/content/popup/interest/agent/rights'; + + //圈子代理人价格 + static var buyInterestAgentPrice = '/mall-service/mall/wallet/trade/buyInterestAgent/price'; + + //购买圈子代理人 + static var buyInterestAgent = '/mall-service/mall/wallet/trade/buyInterestAgent'; + } diff --git a/circle_app/lib/net/dio_manager.dart b/circle_app/lib/net/dio_manager.dart index 65329e6..b4d6fc0 100644 --- a/circle_app/lib/net/dio_manager.dart +++ b/circle_app/lib/net/dio_manager.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:circle_app/router/routers.dart'; import 'package:circle_app/utils/util.dart'; import 'package:dio/dio.dart'; +import 'package:dio/io.dart'; import 'package:flutter_bugly/flutter_bugly.dart'; import '../utils/SharedPreferencesHelper.dart'; @@ -36,6 +37,11 @@ class DioManager { return _instance!; } + static CancelToken _globalCancelToken = CancelToken(); // 添加全局CancelToken + + // 存储每个请求的 CancelToken + Map _cancelTokens = {}; + Dio? _dio; DioManager._init() { @@ -47,21 +53,30 @@ class DioManager { connectTimeout: const Duration(seconds: 15), // 接收数据的最长时限 receiveTimeout: const Duration(seconds: 15), + )); _dio!.interceptors.add(LogInterceptor( responseBody: true, )); - _dio!.interceptors.add(ConnectivityInterceptor()); + _dio!.interceptors.add(TimingInterceptor()); // 添加拦截器 + // _dio?.httpClientAdapter = IOHttpClientAdapter() + // ..createHttpClient = () { + // // 设置最大连接数 + // HttpClient client = HttpClient(); + // client.idleTimeout = Duration(seconds: 15); // 连接池的空闲超时 + // client.maxConnectionsPerHost = 15; // 设置同一主机的最大连接数为 15 + // return client; + // }; } setDioTimeOut(int time) { - _dio!.options.connectTimeout = Duration(milliseconds: time); + _dio?.options.connectTimeout = Duration(milliseconds: time); } setDioBaseUrl(String url) { if (url != _dio!.options.baseUrl && _dio!.options.baseUrl == Api.testBaseUrl) - _dio!.options = BaseOptions( + _dio?.options = BaseOptions( // 请求基地址 baseUrl: url, // 连接服务器超时时间,单位是毫秒 @@ -71,12 +86,25 @@ class DioManager { ); } + + cancelAllRequest() { + // _globalCancelToken.cancel("用户登出,取消所有请求"); + // _globalCancelToken = CancelToken(); // 重新初始化 CancelToken 以便后续请求 + } + + // 生成请求 Key(根据 URL 和参数) + String _generateRequestKey(String url, Map? params) { + return "$url-${params?.toString() ?? ''}"; + } + + + setReceiveTimeout (int time) { _dio!.options = BaseOptions( // 请求基地址 baseUrl: _dio!.options!.baseUrl, // 连接服务器超时时间,单位是毫秒 - connectTimeout: const Duration(seconds: 30), + connectTimeout: const Duration(seconds: 15), // 接收数据的最长时限 receiveTimeout: Duration(seconds: time), ); @@ -240,6 +268,20 @@ class DioManager { } print(">>>>>$params"); + // 如果没有提供 CancelToken,则使用全局的 + cancelToken ??= _globalCancelToken; + + String key = _generateRequestKey(url, params ?? {}); + + // 如果该请求已经存在,则取消上一个 + if (_cancelTokens.containsKey(key)) { + _cancelTokens[key]!.cancel("重复请求,取消上一个"); + } + + // 创建新的 CancelToken + cancelToken = CancelToken(); + _cancelTokens[key] = cancelToken; + /// 不同请求方法,不同的请求参数,按实际项目需求分. /// 这里 get 是 queryParameters,其它用 data. FormData 也是 data @@ -247,7 +289,7 @@ class DioManager { switch (method) { case DioMethod.get: response = await _dio! - .request(url, queryParameters: params, options: options); + .request(url, queryParameters: params, options: options,cancelToken: cancelToken); break; case DioMethod.post: response = await _dio!.post(url, @@ -259,11 +301,11 @@ class DioManager { break; case DioMethod.put: response = - await _dio!.put(url, data: json.encode(params), options: options); + await _dio!.put(url, data: json.encode(params), options: options,cancelToken: cancelToken); break; case DioMethod.delete: response = await _dio! - .delete(url, queryParameters: params, options: options); + .delete(url, queryParameters: params, options: options,cancelToken: cancelToken); break; default: // 如果有formData参数,说明是传文件,忽略params的参数 @@ -278,6 +320,9 @@ class DioManager { data: params, cancelToken: cancelToken, options: options); } } + + // 请求完成后移除 token + _cancelTokens.remove(key); // json转model String jsonStr = json.encode(response.data); Map responseMap = json.decode(jsonStr); @@ -305,6 +350,18 @@ class DioManager { } return responseMap; } on DioException catch (e) { + if (e.type == DioExceptionType.cancel) return {'code': 500, 'msg': ''}; + print("请求失败: ${e.message}"); + print("请求URL: ${e.requestOptions.uri}"); + print("请求Headers: ${e.requestOptions.headers}"); + print("请求数据: ${e.requestOptions.data}"); + print("错误类型: ${e.type}"); // 检查 DioErrorType + // 获取连接池信息(仅适用于 Dart 原生 HttpClient) + // final adapter = _dio!.httpClientAdapter as IOHttpClientAdapter; + // HttpClient client = adapter.createHttpClient!(); + // print("最大连接数: ${client.maxConnectionsPerHost}"); + + SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); if (sp.getString(SharedPreferencesHelper.LOGINPHONE) == '18800000100') { return {'code': 500, 'msg': ''}; @@ -432,3 +489,36 @@ class QnTokenData { ); } } + + +class TimingInterceptor extends Interceptor { + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + options.extra["startTime"] = DateTime.now(); // 记录开始时间 + super.onRequest(options, handler); + } + + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + DateTime startTime = response.requestOptions.extra["startTime"]; + DateTime endTime = DateTime.now(); + Duration duration = endTime.difference(startTime); + + print("请求 URL: ${response.requestOptions.uri}"); + print("请求耗时: ${duration.inMilliseconds} ms"); + + super.onResponse(response, handler); + } + + @override + void onError(DioException err, ErrorInterceptorHandler handler) { + DateTime startTime = err.requestOptions.extra["startTime"]; + DateTime endTime = DateTime.now(); + Duration duration = endTime.difference(startTime); + + print("请求失败 URL: ${err.requestOptions.uri}"); + print("请求失败耗时: ${duration.inMilliseconds} ms"); + + super.onError(err, handler); + } +} diff --git a/circle_app/lib/utils/SharedPreferencesHelper.dart b/circle_app/lib/utils/SharedPreferencesHelper.dart index ee4b60b..20816ee 100644 --- a/circle_app/lib/utils/SharedPreferencesHelper.dart +++ b/circle_app/lib/utils/SharedPreferencesHelper.dart @@ -40,6 +40,10 @@ class SharedPreferencesHelper { static const fraudPreventionTip = 'fraudPreventionTip'; + static const nearTip = 'nearTip'; + + static const serveTip = 'serveTip'; + static SharedPreferencesHelper? _instance; static SharedPreferences? _preferences; @@ -217,6 +221,22 @@ class SharedPreferencesHelper { preferences!.setBool(SettingStatus, status); } + Future isShowNearLocation() async { + String time = await preferences!.getString(nearTip) ?? ''; + if (time.isNotEmpty) { + DateTime dateTime = DateTime.parse(time); + bool isShow = !isSameDay(dateTime,DateTime.now()); + if (isShow) { + preferences!.setString(nearTip, DateTime.now().toString()); + } + return isShow; + } else { + preferences!.setString(nearTip, DateTime.now().toString()); + } + return true; + } + + bool isSameDay(DateTime time1, DateTime time2) { return time1.year == time2.year && diff --git a/circle_app/lib/utils/util.dart b/circle_app/lib/utils/util.dart index f34c041..fbe2b1c 100644 --- a/circle_app/lib/utils/util.dart +++ b/circle_app/lib/utils/util.dart @@ -7,6 +7,7 @@ import 'package:circle_app/circle_app/chat/logic.dart'; import 'package:circle_app/circle_app/chat/view.dart'; import 'package:circle_app/circle_app/circle/view.dart'; import 'package:circle_app/circle_app/circle/widgets/discover.dart'; +import 'package:circle_app/circle_app/circle_list/widgets/apply_for_an_agent_dialog.dart'; import 'package:circle_app/circle_app/userinfo/logic.dart'; import 'package:circle_app/circle_app/world_call_out/logic.dart'; import 'package:circle_app/commons/Widgets/base_tip_widget.dart'; @@ -114,6 +115,7 @@ const bgImage = DecorationImage( bool isShowToast = false; ///弹窗文本提示 msg: 提示内容 showOKToast(String msg) { + if (msg.isEmpty) return; if (isShowToast) return; isShowToast = true; int seconds = msg.length > 15 ? 5 : msg.length > 10 ? 3 : 2; @@ -186,7 +188,7 @@ noResultWidget({String tip = '正在等待被填充~',Function? callBack, String children: [ Image.asset( getBaseImage('no_result'), - width: 200.sp, + width: 200.sp, ), SizedBox( height: 8.sp, @@ -196,7 +198,7 @@ noResultWidget({String tip = '正在等待被填充~',Function? callBack, String tip, style: TextStyle(color: Color(0xffdbdbdb), fontSize: 15.sp), ), - if (callBack != null) + if (callBack != null && action.isNotEmpty) GestureDetector( onTap: () { callBack(); @@ -204,7 +206,7 @@ noResultWidget({String tip = '正在等待被填充~',Function? callBack, String child: Container( margin: EdgeInsets.only(top: 10.sp), height: 42.sp, - width: 160.sp, + width: action.length > 6 ? 200.sp : 160.sp, alignment: Alignment.center, // padding: EdgeInsets.only(left: 4.sp,right: 4.sp), decoration: BoxDecoration( @@ -274,6 +276,7 @@ String convertToThousand(int number) { } pushLoginPage() async { + DioManager.getInstance().cancelAllRequest(); await logoutIM(); SharedPreferencesHelper.getInstance().then((sharedPreferences) { String loginPhone = @@ -293,6 +296,7 @@ pushLoginPage() async { sharedPreferences.setString(SharedPreferencesHelper.firstLogin, '1'); sharedPreferences.setString(SharedPreferencesHelper.UPDATEONE, updateone); sharedPreferences.setString(SharedPreferencesHelper.UPDATE, update); + sharedPreferences.setBool(SharedPreferencesHelper.serveTip, false); sharedPreferences.setStringList(tipList); }); @@ -412,6 +416,125 @@ String getRoleContent(int number) { } } +void showAgentManualDialog(BuildContext context,String msg) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 470.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: AppColor.bgColor, + borderRadius: BorderRadius.circular(12.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"),fit: BoxFit.fill,), + // ), + 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: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + msg, + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + width: 130.w, + alignment: Alignment.center, + height: 40.sp, + margin: EdgeInsets.only(top: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.sp), + gradient: const LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + child: const Text( + "我知道了", + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + ), + ), + ), + // GestureDetector( + // onTap: () { + // Get.back(); + // Get.toNamed(Routes.InvitePage); + // }, + // child: Container( + // width: 130.w, + // height: 40.sp, + // alignment: Alignment.center, + // margin: EdgeInsets.only(top: 16.sp), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(20.sp), + // gradient: AppColor.mainVerLinearGradient, + // ), + // child: const Text( + // "快速体验(98元/月)", + // style: TextStyle( + // color: Colors.white, + // fontSize: 14, + // ), + // ), + // ), + // ), + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); +} + typedef void MyCallback(String path); // Future compressVideo( @@ -723,21 +846,24 @@ Widget circlrPeopleInfoWidget(List widgets,Circle bean) { height: 30.sp, width: 30.0.sp + 15.sp * (widgets.length - 1.sp), - child: Stack( + child: IgnorePointer( + ignoring: true, // true 表示忽略手势,组件不可点击 + child:Stack( alignment: Alignment.center, children: widgets, - ), + )), ), SizedBox( - width: 4.sp, + width: 0.sp, ), + Text( '${convertToTenThousand(bean.joinTotal)}圈友加入', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, fontSize: 15.sp), ), SizedBox( - width: 4.sp, + width: 2.sp, ), Image.asset(getCircleImage('more_icon'),width: 20.sp,), ], @@ -1739,105 +1865,15 @@ void sendApplyToAgentData(var circleId) async { } Get.toNamed(Routes.Chat, arguments: con); } else if (data['code'] == 32104) { - showReportDialog(Get.context!,data['msg']); + showReportDialog(Get.context!,circleId); } } -void showReportDialog(BuildContext context,String msg) { +void showReportDialog(BuildContext context,String circleId) { showDialog( context: context, builder: (BuildContext context) { - return Dialog( - backgroundColor: Colors.transparent, - child: Container( - height: 200.sp, - padding: const EdgeInsets.all(1.0), - child: Stack( - children: [ - Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: AppColor.bgColor, - borderRadius: BorderRadius.circular(12.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"),fit: BoxFit.fill,), - // ), - 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: 12.sp, left: 14.sp, right: 14.sp), - alignment: Alignment.center, - child: Text( - msg, - textAlign: TextAlign.left, - style: TextStyle( - color: const Color(0xCCF7FAFA), fontSize: 16.sp), - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - - GestureDetector( - onTap: () { - Get.back(); - Get.toNamed(Routes.InvitePage); - }, - 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, - ), - ), - ), - ) - ], - ) - ], - ), - ) - ], - ), - ), - ); + return ApplyForAnAgentDialog(circleId: int.parse('${circleId}')); }, ); } diff --git a/circle_app/lib/view/notice.dart b/circle_app/lib/view/notice.dart index 573d7ac..82f0ee0 100644 --- a/circle_app/lib/view/notice.dart +++ b/circle_app/lib/view/notice.dart @@ -47,7 +47,7 @@ void showFloatingButtonOverlay(BuildContext context, String nickname, child: AnimatedContainer( duration: const Duration(milliseconds: 500), curve: Curves.easeInOut, - height: showMessage ? 85 : 0, + height: showMessage ? 75 : 0, child: Container( width: Get.width - 16, // margin: EdgeInsets.only(top:10.sp),