From f9fd2f78f66e1d4d45c5ca0cdd8709267ac2ad2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Mon, 16 Mar 2026 18:13:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/login_warning.png | Bin 0 -> 17119 bytes lib/components/home_appbar.dart | 1 + .../discover/search_page_controller.dart | 3 + .../message/conversation_controller.dart | 2 + lib/controller/mine/user_controller.dart | 153 ++++++++++++++++++ lib/generated/assets.dart | 1 + lib/model/mine/user_base_data.dart | 12 ++ lib/pages/discover/discover_page.dart | 31 +++- lib/pages/discover/search_page.dart | 10 +- lib/pages/home/content_card.dart | 4 + lib/pages/home/home_page.dart | 14 +- lib/pages/home/timeline_item.dart | 24 +++ lib/pages/main/main_page.dart | 15 +- lib/pages/message/conversation_tab.dart | 80 +++++---- lib/pages/message/message_page.dart | 80 ++++++--- lib/pages/mine/mine_page.dart | 27 +++- 16 files changed, 380 insertions(+), 77 deletions(-) create mode 100644 assets/images/login_warning.png diff --git a/assets/images/login_warning.png b/assets/images/login_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ee324e6e1a18eb8c9ef42eed45a96da64a9901c8 GIT binary patch literal 17119 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 a?f(a_sAt?yIRA_Q0000 { ), SizedBox(height: ScreenUtil().setWidth(4),), if(currentActive == entry.key) Image.asset( + gaplessPlayback: true, Assets.imagesTabChangeIcon, width: 20, ) diff --git a/lib/controller/discover/search_page_controller.dart b/lib/controller/discover/search_page_controller.dart index b973046..968802e 100644 --- a/lib/controller/discover/search_page_controller.dart +++ b/lib/controller/discover/search_page_controller.dart @@ -36,6 +36,9 @@ class SearchPageController extends GetxController { } searchData() async { + if(name.value.trim() == "" || name.value.trim().isEmpty){ + return; + } try{ final response = await _networkService.rtcApi.userPageLiveMatchmaker( diff --git a/lib/controller/message/conversation_controller.dart b/lib/controller/message/conversation_controller.dart index 7f2fe00..a37ac83 100644 --- a/lib/controller/message/conversation_controller.dart +++ b/lib/controller/message/conversation_controller.dart @@ -73,6 +73,7 @@ class ConversationController extends GetxController { final name = "".obs; final showSearch = false.obs; + final isSearch = false.obs; @@ -81,6 +82,7 @@ class ConversationController extends GetxController { } search(){ + isSearch.value = true; if(name.value == ""){ _checkAndLoadConversations(); } else { diff --git a/lib/controller/mine/user_controller.dart b/lib/controller/mine/user_controller.dart index 786a1c5..e9b91be 100644 --- a/lib/controller/mine/user_controller.dart +++ b/lib/controller/mine/user_controller.dart @@ -1,5 +1,13 @@ +import 'package:dating_touchme_app/controller/discover/room_controller.dart'; +import 'package:dating_touchme_app/controller/message/conversation_controller.dart'; +import 'package:dating_touchme_app/controller/overlay_controller.dart'; +import 'package:dating_touchme_app/extension/ex_widget.dart'; +import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; import 'package:dating_touchme_app/oss/oss_manager.dart'; +import 'package:dating_touchme_app/pages/mine/login_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get_storage/get_storage.dart'; @@ -85,6 +93,57 @@ class UserController extends GetxController { return false; } + + + void logout() async { + // 退出直播间 + if (Get.isRegistered()) { + try { + final roomController = Get.find(); + await roomController.leaveChannel(); + } catch (e) { + print('退出直播间失败: $e'); + } + } + + // 取消小窗口 + if (Get.isRegistered()) { + try { + final overlayController = Get.find(); + overlayController.hide(); // 隐藏直播房间小窗 + overlayController.hideVideoCall(); // 隐藏视频通话小窗 + } catch (e) { + print('取消小窗口失败: $e'); + } + } + + // 先退出 IM 登录 + if(IMManager.instance.isInitialized){ + await IMManager.instance.logout(); + } + // 清除会话列表和用户信息缓存 + if (Get.isRegistered()) { + final conversationController = Get.find(); + conversationController.clearConversations(); + } + // App清除本地存储,有待处理, + // storage.erase(); + storage.remove('userId'); + storage.remove('token'); + // storage.write('hasAgreedUserAgreement', true); + // 清除全局数据 + GlobalData().logout(); + Get.offAll(() => LoginPage()); + } + + static const statusMap = { + 1: '3天', + 2: '7天', + 3: '15天', + 4: '30天', + 5: '永久', + }; + /// 获取用户基础信息 Future getBaseUserInfo(String userId, bool isMain) async { try { @@ -93,6 +152,100 @@ class UserController extends GetxController { if (response.data.isSuccess && response.data.data != null) { // 成功获取基础信息后,调用获取婚姻信息详情接口 final baseInfo = response.data.data!; + if(baseInfo.isForbidden == true){ + + final storage = GetStorage(); + final userId = storage.read('userId'); + if (userId != null && userId.isNotEmpty) { + + logout(); + } + SmartDialog.dismiss(); + + + + SmartDialog.show( + onDismiss: (){ + SmartDialog.dismiss(); + }, + builder: (context) { + return ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(16.w)), + child: Material( + color: Colors.white, + child: Container( + width: 311.w, + height: 256.w, + padding: EdgeInsets.only( + top: 18.w, + right: 19.w, + left: 19.w + ), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFFFFFFFF), + Color(0xFFF4F2FF), + ], + ), + ), + child: Column( + children: [ + Image.asset( + Assets.imagesLoginWarning, + width: 44.w, + height: 44.w, + ), + SizedBox(height: 4.w,), + Text( + "账号已限制登录", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.w + ), + ), + SizedBox(height: 10.w,), + Text( + "你的账号涉嫌违规已被系统封禁,如需申诉,请点击右上角联系客服进行反馈。\n" + "封禁时间:${statusMap[baseInfo.forbiddenCycle] ?? "未知"}\n" + "${baseInfo.forbiddenCycle != 5 ? "解除时间:${baseInfo.forbiddenEndTime}" : ""}", + style: TextStyle( + fontSize: 13.w + ), + ), + SizedBox(height: 12.w,), + Container( + width: 128.w, + height: 40.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(12.w)), + color: const Color.fromRGBO(117, 98, 249, 1) + ), + child: Center( + child: Text( + "知道了", + style: TextStyle( + fontSize: 14.w, + color: Colors.white + ), + ), + ), + ).onTap(() { + + // 隐藏 overlay + SmartDialog.dismiss(); + }) + ], + ), + ), + ), + ); + }, + ); + return ; + } final result = await _userApi.getMarriageInformationDetail(); // print(result.data); if (result.data.isSuccess) { diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 5cc4e57..95b4ff7 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -146,6 +146,7 @@ class Assets { static const String imagesLocationIcon = 'assets/images/location_icon.png'; static const String imagesLoginBg = 'assets/images/login_bg.png'; static const String imagesLoginLogo = 'assets/images/login_logo.png'; + static const String imagesLoginWarning = 'assets/images/login_warning.png'; static const String imagesMail = 'assets/images/mail.png'; static const String imagesMale = 'assets/images/male.png'; static const String imagesMaleEmpty = 'assets/images/male_empty.png'; diff --git a/lib/model/mine/user_base_data.dart b/lib/model/mine/user_base_data.dart index ccf2071..c862808 100644 --- a/lib/model/mine/user_base_data.dart +++ b/lib/model/mine/user_base_data.dart @@ -50,6 +50,9 @@ class UserBaseData { final LiveMatchmaker? liveMatchmaker; final int matchmakerType; final bool? isOnline; // 在线状态 + final bool? isForbidden; + final String? forbiddenEndTime; + final int forbiddenCycle; UserBaseData({ @@ -62,6 +65,9 @@ class UserBaseData { required this.matchmakerType, this.liveMatchmaker, this.isOnline, + this.isForbidden, + required this.forbiddenEndTime, + required this.forbiddenCycle, }); // 从JSON映射创建实例 @@ -76,6 +82,9 @@ class UserBaseData { userId: json['userId'] ?? '', liveMatchmaker: json['liveMatchmaker'] != null ? LiveMatchmaker.fromJson(json['liveMatchmaker'] as Map) : null, isOnline: json['isOnline'] as bool?, + isForbidden: json['isForbidden'] as bool?, + forbiddenCycle: json['forbiddenCycle'] ?? 0, + forbiddenEndTime: json['forbiddenEndTime'] ?? '', ); } @@ -91,6 +100,9 @@ class UserBaseData { 'userId': userId, 'liveMatchmaker': liveMatchmaker?.toJson(), 'isOnline': isOnline, + 'isForbidden': isForbidden, + 'forbiddenCycle': forbiddenCycle, + 'forbiddenEndTime': forbiddenEndTime, }; } diff --git a/lib/pages/discover/discover_page.dart b/lib/pages/discover/discover_page.dart index 3c7b04b..9ebae75 100644 --- a/lib/pages/discover/discover_page.dart +++ b/lib/pages/discover/discover_page.dart @@ -65,7 +65,11 @@ class _DiscoverPageState extends State super.build(context); return Stack( children: [ + Positioned.fill( + child: Container(color: Colors.white,), + ), Image.asset( + gaplessPlayback: true, Assets.imagesBgInformation, fit: BoxFit.cover, width: double.infinity, @@ -84,9 +88,30 @@ class _DiscoverPageState extends State right: Row( children: [ - Icon( - Icons.search, - size: 30, + Container( + width: 60.w, + height: 27.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(27.w)), + color: const Color.fromRGBO(0, 0, 0, .2) + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.search, + size: 15.w, + color: Colors.white, + ), + Text( + "搜索", + style: TextStyle( + fontSize: 12.w, + color: Colors.white + ), + ) + ], + ), ).onTap((){ Get.to(() => SearchPage()); }), diff --git a/lib/pages/discover/search_page.dart b/lib/pages/discover/search_page.dart index 7f74ee7..b60d78d 100644 --- a/lib/pages/discover/search_page.dart +++ b/lib/pages/discover/search_page.dart @@ -31,18 +31,18 @@ class SearchPage extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 15.w), margin: EdgeInsets.only(bottom: 10.w), child: Container( - height: 30.w, + height: 45.w, padding: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.w)), - color: const Color.fromRGBO(200, 200, 200, 1.0) + borderRadius: BorderRadius.all(Radius.circular(9.w)), + color: const Color.fromRGBO(247, 247, 247, 1.0) ), child: Row( children: [ Icon( Icons.search, size: 20, - color: Colors.grey, + color: const Color.fromRGBO(51, 51, 51, 1), ), Expanded( child: TextField( @@ -97,7 +97,7 @@ class SearchPage extends StatelessWidget { Text( "仅支持搜索", style: TextStyle( - color: const Color.fromRGBO(121, 121, 121, 1) + color: const Color.fromRGBO(189, 189, 189, 1) ), ), Text( diff --git a/lib/pages/home/content_card.dart b/lib/pages/home/content_card.dart index 423beb5..661cad4 100644 --- a/lib/pages/home/content_card.dart +++ b/lib/pages/home/content_card.dart @@ -55,6 +55,7 @@ class _CardHeader extends StatelessWidget { ), ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 60, height: 60, @@ -106,6 +107,7 @@ class _CardHeader extends StatelessWidget { mainAxisSize: MainAxisSize.min, // 确保Row只占用必要的宽度 children: [ Image.asset( + gaplessPlayback: true, Assets.imagesVerifiedIcon, width: 14, height: 12, @@ -205,6 +207,7 @@ class _CardHeader extends StatelessWidget { } }, child: !item.liveStreaming ? Image.asset( + gaplessPlayback: true, _getButtonImage(isLive, isOnline), width: item.liveStreaming ? 60 : 50, height: 30, @@ -377,6 +380,7 @@ class _NetworkImageWidget extends StatelessWidget { ), ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 60, height: 60, diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index f321f93..9f6c179 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -31,8 +31,13 @@ class _HomePageState extends State builder: (controller) { return Stack( children: [ + + Positioned.fill( + child: Container(color: Colors.white,), + ), // 背景图 - 覆盖整个屏幕包括状态栏和导航栏 Image.asset( + gaplessPlayback: true, Assets.imagesBgInformation, fit: BoxFit.cover, width: double.infinity, @@ -62,9 +67,9 @@ class _HomePageState extends State index: controller.selectedTabIndex.value, children: const [ // 同城列表 + RecommendTab(), AllTimeline(), // 推荐列表 - RecommendTab(), NearbyTab() ], ); @@ -86,9 +91,9 @@ class _HomePageState extends State mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - _buildTabButton(title: '广场', index: 0, controller: controller), + _buildTabButton(title: '推荐', index: 0, controller: controller), const SizedBox(width: 28), - _buildTabButton(title: '推荐', index: 1, controller: controller), + _buildTabButton(title: '广场', index: 1, controller: controller), const SizedBox(width: 28), _buildTabButton(title: '同城', index: 2, controller: controller), ], @@ -131,7 +136,8 @@ class _HomePageState extends State ), const SizedBox(height: 6), selected - ? Image.asset(Assets.imagesTabChangeIcon, width: 32, height: 8) + ? Image.asset(Assets.imagesTabChangeIcon, width: 32, height: 8, + gaplessPlayback: true,) : const SizedBox(height: 8), ], ), diff --git a/lib/pages/home/timeline_item.dart b/lib/pages/home/timeline_item.dart index 7306b08..9c52e3b 100644 --- a/lib/pages/home/timeline_item.dart +++ b/lib/pages/home/timeline_item.dart @@ -54,6 +54,7 @@ class _TimelineItemState extends State { Padding( padding: EdgeInsets.symmetric(horizontal: 0), child: Image.asset( + gaplessPlayback: true, emoji.path, width: 24.w, height: 24.w, @@ -156,6 +157,24 @@ class _TimelineItemState extends State { width: 40.w, height: 40.w, fit: BoxFit.cover, + + + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(40), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, + Assets.imagesUserAvatar, + width: 105.w, + height: 105.w, + fit: BoxFit.cover, + ), ), ).onTap((){ Get.to(() => UserInformationPage(miId: widget.item.miId ?? "")); @@ -235,6 +254,7 @@ class _TimelineItemState extends State { ), ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 341.w, height: 341.w, @@ -263,6 +283,7 @@ class _TimelineItemState extends State { ), ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 165.w, height: 165.w, @@ -295,6 +316,7 @@ class _TimelineItemState extends State { ), ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 105.w, height: 105.w, @@ -313,6 +335,7 @@ class _TimelineItemState extends State { Row( children: [ Image.asset( + gaplessPlayback: true, (widget.item.isLiked ?? false) ? Assets.imagesLikeActive : Assets.imagesLikeIcon, width: 14.w, height: 12.w, @@ -333,6 +356,7 @@ class _TimelineItemState extends State { Row( children: [ Image.asset( + gaplessPlayback: true, Assets.imagesCommentIcon, width: 15.w, height: 15.w, diff --git a/lib/pages/main/main_page.dart b/lib/pages/main/main_page.dart index 9dcbd65..4457854 100644 --- a/lib/pages/main/main_page.dart +++ b/lib/pages/main/main_page.dart @@ -96,9 +96,10 @@ class _MainPageState extends State { children: [ _buildBottomNavigationBar(), Positioned( + left: MediaQuery.of(context).size.width / 2 - 30, top: -20, - left: 150, child: Image.asset( + gaplessPlayback: true, Assets.imagesPublish, width: 60, height: 60, @@ -135,8 +136,10 @@ class _MainPageState extends State { tabItem('找对象', Assets.imagesDiscoverPre, Assets.imagesDiscoverNol, 1, 0), TDBottomTabBarTabConfig( tabText: "", - selectedIcon: Image.asset(Assets.imagesHomePre, width: 30, height: 30, fit: BoxFit.cover, color: Colors.transparent,), - unselectedIcon: Image.asset(Assets.imagesHomeNol, width: 30, height: 30, fit: BoxFit.cover, color: Colors.transparent,), + selectedIcon: Image.asset( + gaplessPlayback: true,Assets.imagesHomePre, width: 30, height: 30, fit: BoxFit.cover, color: Colors.transparent,), + unselectedIcon: Image.asset( + gaplessPlayback: true,Assets.imagesHomeNol, width: 30, height: 30, fit: BoxFit.cover, color: Colors.transparent,), onTap: (){ Get.to(() => SendTimeline()); } @@ -152,8 +155,10 @@ class _MainPageState extends State { TDBottomTabBarTabConfig tabItem(String title, String selectedIcon, String unselectedIcon, int index, int unreadCount) { return TDBottomTabBarTabConfig( tabText: title, - selectedIcon: Image.asset(selectedIcon, width: 30, height: 30, fit: BoxFit.cover), - unselectedIcon: Image.asset(unselectedIcon, width: 30, height: 30, fit: BoxFit.cover), + selectedIcon: Image.asset( + gaplessPlayback: true,selectedIcon, width: 30, height: 30, fit: BoxFit.cover), + unselectedIcon: Image.asset( + gaplessPlayback: true,unselectedIcon, width: 30, height: 30, fit: BoxFit.cover), selectTabTextStyle: TextStyle(color: Color(0xFFED4AC3)), unselectTabTextStyle: TextStyle(color: Color(0xFF999999)), badgeConfig: BadgeConfig( diff --git a/lib/pages/message/conversation_tab.dart b/lib/pages/message/conversation_tab.dart index 4f4c156..e4cd88f 100644 --- a/lib/pages/message/conversation_tab.dart +++ b/lib/pages/message/conversation_tab.dart @@ -29,43 +29,51 @@ class _ConversationTabState extends State super.build(context); return Column( children: [ - Container( - padding: EdgeInsets.symmetric( - horizontal: 22.w - ), - child: Row( - children: [ - Column( + Obx((){ + if(!controller.isSearch.value){ + return Container( + padding: EdgeInsets.symmetric( + horizontal: 22.w + ), + child: Row( children: [ - Container( - width: 90.w, - height: 50.w, - margin: EdgeInsets.only(bottom: 5.w), - decoration: BoxDecoration( - color: const Color.fromRGBO(226, 222, 255, 1), - borderRadius: BorderRadius.all(Radius.circular(50.w)) - ), - child: Center( - child: Image.asset( - Assets.imagesConnectHistoryIcon, - width: 40.w, - height: 40.w, + Column( + children: [ + Container( + width: 90.w, + height: 50.w, + margin: EdgeInsets.only(bottom: 5.w), + decoration: BoxDecoration( + color: const Color.fromRGBO(226, 222, 255, 1), + borderRadius: BorderRadius.all(Radius.circular(50.w)) + ), + child: Center( + child: Image.asset( + gaplessPlayback: true, + Assets.imagesConnectHistoryIcon, + width: 40.w, + height: 40.w, + ), + ), ), - ), - ), - Text( - "连线记录", - style: TextStyle( - fontSize: 11.w - ), - ) + Text( + "连线记录", + style: TextStyle( + fontSize: 11.w + ), + ) + ], + ).onTap((){ + Get.to(() => ConnectHistoryPage()); + }) ], - ).onTap((){ - Get.to(() => ConnectHistoryPage()); - }) - ], - ), - ), + ), + ); + } else { + return SizedBox(); + } + + }), // 聊天列表 Expanded( child: Obx(() { @@ -219,12 +227,14 @@ class _BuildConversationItemState extends State { height: 56, fit: BoxFit.cover, placeholder: (context, url) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 56, height: 56, fit: BoxFit.cover, ), errorWidget: (context, url, error) => Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 56, height: 56, @@ -232,6 +242,7 @@ class _BuildConversationItemState extends State { ), ) : Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 56, height: 56, @@ -429,6 +440,7 @@ class _BuildConversationItemState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 2.w), child: Image.asset( + gaplessPlayback: true, emoji.path, width: 16.w, height: 16.w, diff --git a/lib/pages/message/message_page.dart b/lib/pages/message/message_page.dart index 65df047..e84e713 100644 --- a/lib/pages/message/message_page.dart +++ b/lib/pages/message/message_page.dart @@ -41,6 +41,7 @@ class _MessagePageState extends State with AutomaticKeepAliveClient super.build(context); return Container( decoration: BoxDecoration( + color: Colors.white, image: DecorationImage( image: AssetImage(Assets.imagesBgInformation), fit: BoxFit.cover, @@ -71,24 +72,24 @@ class _MessagePageState extends State with AutomaticKeepAliveClient ), actions: [ Container( - width: 243, + width: !controller.showSearch.value ? 200 : 270, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ if(controller.showSearch.value) Expanded( child: Container( - height: 30.w, + height: 27.w, padding: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.w)), - color: const Color.fromRGBO(200, 200, 200, 1.0) + borderRadius: BorderRadius.all(Radius.circular(27.w)), + color: Colors.white ), child: Row( children: [ Icon( Icons.search, size: 20, - color: Colors.grey, + color: const Color.fromRGBO(144, 144, 144, 1) ), Expanded( child: TextField( @@ -129,12 +130,6 @@ class _MessagePageState extends State with AutomaticKeepAliveClient SizedBox(width: 10,), Row( children: [ - Container( - height: 15, - width: 1, - color: const Color.fromRGBO(51, 51, 51, 1), - ), - SizedBox(width: 10,), Text( "搜索", style: TextStyle( @@ -150,13 +145,44 @@ class _MessagePageState extends State with AutomaticKeepAliveClient ), ), SizedBox(width: 10,), - Icon( - Icons.search, - size: 30, + if(!controller.showSearch.value) Container( + width: 60.w, + height: 27.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(27.w)), + color: Colors.white + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.search, + size: 15.w, + ), + Text( + "搜索", + style: TextStyle( + fontSize: 12.w + ), + ) + ], + ), ).onTap((){ controller.showSearch.value = !controller.showSearch.value; setState(() { + }); + }), + if(controller.showSearch.value) Text( + "收起", + style: TextStyle( + fontSize: 14.w + ), + ).onTap((){ + controller.isSearch.value = false; + controller.showSearch.value = !controller.showSearch.value; + setState(() { + }); }) ], @@ -164,15 +190,31 @@ class _MessagePageState extends State with AutomaticKeepAliveClient ), SizedBox(width: 10,), // 过滤器按钮 - GestureDetector( + if(!controller.showSearch.value) GestureDetector( key: _filterButtonKey, onTap: () => _showFilterMenu(context), child: Container( - width: 20, - height: 20, + width: 60.w, + height: 27.w, margin: const EdgeInsets.only(right: 16), alignment: Alignment.center, - child: Image.asset(Assets.imagesFilterIcon, width: 20,), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(27.w)), + color: Colors.white + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset(Assets.imagesFilterIcon, width: 12.w, + gaplessPlayback: true,), + Text( + "筛选", + style: TextStyle( + fontSize: 12.w + ), + ) + ], + ), ), ), ], @@ -210,6 +252,7 @@ class _MessagePageState extends State with AutomaticKeepAliveClient const SizedBox(height: 6), isSelected ? Image.asset( + gaplessPlayback: true, Assets.imagesTabChangeIcon, width: 20, ) @@ -327,6 +370,7 @@ class _MessagePageState extends State with AutomaticKeepAliveClient child: Row( children: [ Image.asset( + gaplessPlayback: true, icon, width: 20, height: 20, diff --git a/lib/pages/mine/mine_page.dart b/lib/pages/mine/mine_page.dart index d6d0832..4a79128 100644 --- a/lib/pages/mine/mine_page.dart +++ b/lib/pages/mine/mine_page.dart @@ -150,6 +150,7 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ ), ), ) : Image.asset( + gaplessPlayback: true, Assets.imagesUserAvatar, width: 60.w, height: 60.w, @@ -191,6 +192,7 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ ), child: Center( child: Image.asset( + gaplessPlayback: true, Assets.imagesVipFont, width: 20.w, height: 8.w, @@ -226,6 +228,7 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ child: Row( children: [ Image.asset( + gaplessPlayback: true, Assets.imagesEdit, width: 10.w, height: 10.w, @@ -296,7 +299,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ style: cellStyle, cells: [ TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesRose, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesRose, height: 22.w, width: 22.w), titleWidget: Text( "我的玫瑰", style: TextStyle( @@ -307,7 +311,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesWallet, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesWallet, height: 22.w, width: 22.w), titleWidget: Text( "我的钱包", style: TextStyle( @@ -318,7 +323,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesCert, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesCert, height: 22.w, width: 22.w), titleWidget: Text( "认证中心", style: TextStyle( @@ -342,7 +348,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesMatchmaker, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesMatchmaker, height: 22.w, width: 22.w), titleWidget: Text( "红娘等级", style: TextStyle( @@ -353,7 +360,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), if(controller.matchmakerFlag.value)TDCell(arrow: true, - leftIconWidget: Image.asset('assets/images/matcher_task.png', height: 20.w, width: 18.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,'assets/images/matcher_task.png', height: 20.w, width: 18.w), titleWidget: Text( " 红娘任务", style: TextStyle( @@ -373,7 +381,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ style: cellStyle, cells: [ TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesSetting, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesSetting, height: 22.w, width: 22.w), titleWidget: Text( "设置", style: TextStyle( @@ -384,7 +393,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesCustomer, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesCustomer, height: 22.w, width: 22.w), titleWidget: Text( "联系客服", style: TextStyle( @@ -395,7 +405,8 @@ class MinePageState extends State with AutomaticKeepAliveClientMixin{ } ), TDCell(arrow: true, - leftIconWidget: Image.asset(Assets.imagesMail, height: 22.w, width: 22.w), + leftIconWidget: Image.asset( + gaplessPlayback: true,Assets.imagesMail, height: 22.w, width: 22.w), titleWidget: Text( "意见反馈", style: TextStyle(