From 7740b46fa668a4fb2d62a5f169fa7f20c17125fa Mon Sep 17 00:00:00 2001 From: speakeloudest Date: Mon, 22 Dec 2025 18:15:41 -0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86order=5Fstatus?= =?UTF-8?q?=E5=BC=82=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/hi_help/views/hi_help_view.dart | 2 +- .../kr_invite/views/kr_invite_view.dart | 382 +++++++++--------- .../kr_message/views/kr_message_view.dart | 2 +- .../kr_order_status_controller.dart | 2 +- .../views/kr_order_status_view.dart | 14 +- pubspec.yaml | 2 +- 6 files changed, 206 insertions(+), 198 deletions(-) diff --git a/lib/app/modules/hi_help/views/hi_help_view.dart b/lib/app/modules/hi_help/views/hi_help_view.dart index 14c931a..6f91269 100755 --- a/lib/app/modules/hi_help/views/hi_help_view.dart +++ b/lib/app/modules/hi_help/views/hi_help_view.dart @@ -54,7 +54,7 @@ class HIHelpView extends GetView implements HasSwipeConfig { controller: scrollController, child: ListView.builder( controller: scrollController, - padding: EdgeInsets.only(left: 40.w - 20, right: 40.w), + padding: EdgeInsets.only(left: 40.w, right: 40.w), itemCount: controller.kr_messages.length, itemBuilder: (context, index) { final message = controller.kr_messages[index]; diff --git a/lib/app/modules/kr_invite/views/kr_invite_view.dart b/lib/app/modules/kr_invite/views/kr_invite_view.dart index f82bf48..9de5b0a 100755 --- a/lib/app/modules/kr_invite/views/kr_invite_view.dart +++ b/lib/app/modules/kr_invite/views/kr_invite_view.dart @@ -16,214 +16,212 @@ class KRInviteView extends GetView { @override Widget build(BuildContext context) { - final isKeyboardVisible = MediaQuery.of(context).viewInsets.bottom > 0; + // 监听键盘高度,仅用于控制悬浮按钮的可见性 + final bool isKeyboardVisible = MediaQuery.of(context).viewInsets.bottom > 0; return HIBaseScaffold( resizeToAvoidBottomInset: true, - // 1. child 的根组件使用 Stack,以允许绝对定位的组件(如 HIHelpEntrance)正常工作 - child: Stack( - children: [ - SingleChildScrollView( - keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, - physics: const AlwaysScrollableScrollPhysics(), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 40.w), - // 3. 使用一个内层 Column 来组织内容 - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 🟢 第一行:奖励说明 - Container( - width: double.infinity, - padding: - EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.w), - decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(25.r), - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - KrLocalImage( - imageName: 'hi-home-logo', - imageType: ImageType.svg, - width: 54.w, - color: Colors.black, - ), - SizedBox(width: 16.w), - Flexible( - child: Text( - '受邀用户首次付款时,他将与您分别获得3天免费使用时长', - style: TextStyle( - color: Colors.black, - fontSize: 14.sp, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - ), - - SizedBox(height: 26.w), - // 🟢 第二行:我的邀请码 - Container( - padding: - EdgeInsets.symmetric(horizontal: 4.w, vertical: 2.w), - decoration: BoxDecoration( - border: Border.all(color: Colors.white, width: 2.0), - borderRadius: BorderRadius.circular(1000.r), - ), - child: Obx( - () => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: 100.w, - height: 40.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(1000.r), - ), - child: Text( - '邀请码', - style: TextStyle( - color: Colors.black, - fontSize: 16.sp, - fontWeight: FontWeight.w600, - ), - ), - ), - Expanded( - child: Text( - controller.kr_referCode.value, - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 20.sp, - fontWeight: FontWeight.bold, - ), - ), - ), - IconButton( - icon: const KrLocalImage( - imageName: 'share-icon', - imageType: ImageType.svg, - color: Colors.white, - ), - onPressed: () { - if (controller.kr_referCode.value.isNotEmpty) { - final code = controller.kr_referCode.value; - final text = '#您的好友邀请您使用Hi快网络加速器\n' - '安装完毕后,在软件内<邀请好友>页面粘贴以下邀请码\n' - '$code\n' - '您和您的好友将会分别获得3天免费时长\n\n' - '点击此处进入下载页面\n' - '或在浏览器输入hifastvpn.com下载#'; - if (GetPlatform.isIOS) { - Share.share( - text, - subject: '直接分享Hi快VPN邀请链接', - ); - } else { - Clipboard.setData( - ClipboardData( - text: text), - ); - KRCommonUtil.kr_showToast( - AppTranslations.kr_invite.inviteCodeCopied, - ); - } - } - }, - ), - ], - ), - ), - ), - SizedBox(height: 160.w), - // 🟢 第三部分:接受他人邀请 - Column( + child: GestureDetector( + // 允许点击空白处收起键盘 + onTap: () => FocusScope.of(context).unfocus(), + behavior: HitTestBehavior.translucent, + child: Stack( + children: [ + // 1. 背景层/滚动层 + Positioned.fill( + child: SingleChildScrollView( + // 保持手动管理,增强稳定性 + keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.manual, + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 40.w), + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - '接受他人邀请', - style: TextStyle( - color: Colors.white, - fontSize: 14.sp, - fontWeight: FontWeight.bold, - ), - ), - SizedBox(height: 8.h), - TextField( - controller: controller.otherInviteCodeController, - textAlign: TextAlign.center, - style: const TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - decoration: InputDecoration( - hintText: '填入邀请人邀请码兑换免费时长...', - hintStyle: const TextStyle(color: Color(0xFFA6A6A6)), - filled: true, - fillColor: Colors.transparent, - contentPadding: - EdgeInsets.symmetric(horizontal: 22.w), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(1000.r), - borderSide: const BorderSide( - color: Colors.white, width: 2.0), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(1000.r), - borderSide: const BorderSide( - color: Colors.white, width: 2.0), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(1000.r), - borderSide: const BorderSide( - color: Colors.white, width: 2.0), - ), - constraints: BoxConstraints(maxHeight: 50.h), - ), - ), - SizedBox(height: 10.w), - SizedBox( + SizedBox(height: 20.w), + // 🟢 第一行:奖励说明 + Container( width: double.infinity, - height: 50.w, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).primaryColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(1000.r), - ), - ), - onPressed: () { - controller.kr_handleBindInviteCode(); - }, - child: Text( - '保存', - style: TextStyle( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.w), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(25.r), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + KrLocalImage( + imageName: 'hi-home-logo', + imageType: ImageType.svg, + width: 54.w, color: Colors.black, - fontSize: 16.sp, + ), + SizedBox(width: 16.w), + Flexible( + child: Text( + '受邀用户首次付款时,他将与您分别获得3天免费使用时长', + style: TextStyle( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ), + + SizedBox(height: 26.w), + // 🟢 第二行:我的邀请码 + Container( + padding: EdgeInsets.symmetric(horizontal: 4.w, vertical: 2.w), + decoration: BoxDecoration( + border: Border.all(color: Colors.white, width: 2.0), + borderRadius: BorderRadius.circular(1000.r), + ), + child: Obx( + () => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 100.w, + height: 40.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(1000.r), + ), + child: Text( + '邀请码', + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + child: Text( + controller.kr_referCode.value, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 20.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + IconButton( + icon: const KrLocalImage( + imageName: 'share-icon', + imageType: ImageType.svg, + color: Colors.white, + ), + onPressed: () { + if (controller.kr_referCode.value.isNotEmpty) { + final code = controller.kr_referCode.value; + final text = '#您的好友邀请您使用Hi快网络加速器\n' + '安装完毕后,在软件内<邀请好友>页面粘贴以下邀请码\n' + '$code\n' + '您和您的好友将会分别获得3天免费时长\n\n' + '点击此处进入下载页面\n' + '或在浏览器输入hifastvpn.com下载#'; + if (GetPlatform.isIOS) { + Share.share(text, subject: '直接分享Hi快VPN邀请链接'); + } else { + Clipboard.setData(ClipboardData(text: text)); + KRCommonUtil.kr_showToast(AppTranslations.kr_invite.inviteCodeCopied); + } + } + }, + ), + ], + ), + ), + ), + SizedBox(height: 160.w), + // 🟢 第三部分:接受他人邀请 + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '接受他人邀请', + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, fontWeight: FontWeight.bold, ), ), - ), + SizedBox(height: 8.h), + // 使用 RepaintBoundary 隔离,减少父级重绘对 TextField 的影响 + RepaintBoundary( + child: TextField( + controller: controller.otherInviteCodeController, + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + decoration: InputDecoration( + hintText: '填入邀请人邀请码兑换免费时长...', + hintStyle: const TextStyle(color: Color(0xFFA6A6A6)), + filled: true, + fillColor: Colors.transparent, + contentPadding: EdgeInsets.symmetric(horizontal: 22.w), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(1000.r), + borderSide: const BorderSide(color: Colors.white, width: 2.0), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(1000.r), + borderSide: const BorderSide(color: Colors.white, width: 2.0), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(1000.r), + borderSide: const BorderSide(color: Colors.white, width: 2.0), + ), + constraints: BoxConstraints(maxHeight: 50.h), + ), + ), + ), + SizedBox(height: 10.w), + SizedBox( + width: double.infinity, + height: 50.w, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(1000.r), + ), + ), + onPressed: () => controller.kr_handleBindInviteCode(), + child: Text( + '保存', + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], ), + // 底部留白,确保键盘弹出后能滚过遮挡区域 + SizedBox(height: 250.w), ], ), - // 4. 在可滚动区域的末尾添加一个占位边距,防止内容被 HIHelpEntrance 遮挡 - SizedBox(height: 80.w), // 这个高度可以根据 HIHelpEntrance 的实际高度进行微调 - ], + ), ), ), - ), - // 5. 将 HIHelpEntrance 作为 Stack 的直接子元素,它将恢复其原有的绝对定位能力 - if (!isKeyboardVisible) const HIHelpEntrance(), - ], + // 2. 🟢 修正:为了防止遮挡输入框,当键盘弹出时彻底隐藏该悬浮组件 + // 使用 Visibility 配合 maintainState,避免因组件销毁导致的定位状态丢失 + Visibility( + visible: !isKeyboardVisible, + child: const HIHelpEntrance(), + ), + ], + ), ), ); } -} +} \ No newline at end of file diff --git a/lib/app/modules/kr_message/views/kr_message_view.dart b/lib/app/modules/kr_message/views/kr_message_view.dart index 8092c93..ec85e91 100755 --- a/lib/app/modules/kr_message/views/kr_message_view.dart +++ b/lib/app/modules/kr_message/views/kr_message_view.dart @@ -84,7 +84,7 @@ class KRMessageView extends GetView child: ListView.builder( controller: scrollController, padding: - EdgeInsets.only(left: 40.w - 20, right: 40.w), + EdgeInsets.only(left: 40.w, right: 40.w), itemCount: controller.kr_messages.length, itemBuilder: (context, index) { final message = controller.kr_messages[index]; diff --git a/lib/app/modules/kr_order_status/controllers/kr_order_status_controller.dart b/lib/app/modules/kr_order_status/controllers/kr_order_status_controller.dart index b3becfe..1fd79e5 100755 --- a/lib/app/modules/kr_order_status/controllers/kr_order_status_controller.dart +++ b/lib/app/modules/kr_order_status/controllers/kr_order_status_controller.dart @@ -276,7 +276,7 @@ class KROrderStatusController extends GetxController { kr_statusDescription.value = AppTranslations.kr_orderStatus.successDescription; kr_statusIcon.value = 'payment_success'; - kr_subscribeService.kr_fetchAvailableSubscribes(); + // kr_subscribeService.kr_fetchAvailableSubscribes(); // 🔧 修复:移除自动发送事件,改为在用户点击返回按钮时发送 // 这样可以确保导航完成后才发送事件,避免旧控制器被销毁时收到事件 // KREventBus().kr_sendMessage(KRMessageType.kr_payment); diff --git a/lib/app/modules/kr_order_status/views/kr_order_status_view.dart b/lib/app/modules/kr_order_status/views/kr_order_status_view.dart index 3277900..ac7a820 100755 --- a/lib/app/modules/kr_order_status/views/kr_order_status_view.dart +++ b/lib/app/modules/kr_order_status/views/kr_order_status_view.dart @@ -102,9 +102,19 @@ class KROrderStatusView extends GetView { width: double.infinity, height: 48.h, child: ElevatedButton( - onPressed: () { + onPressed: () async { + // 1. 先触发业务层的数据刷新请求(确保内存数据是最新的) + // 假设 kr_subscribeService.kr_fetchAvailableSubscribes() 返回 Future + await controller.kr_subscribeService.kr_fetchAvailableSubscribes(); + + // 2. 发送事件总线通知 KREventBus().kr_sendMessage(KRMessageType.kr_payment); - // 返回到首页(清空导航栈) + + // 3. 关键:稍微延迟一下再执行 offAllNamed + // 这样可以确保 EventBus 的消息被其他观察者消费完毕,并让网络请求有时间在内存中沉淀 + await Future.delayed(const Duration(milliseconds: 100)); + + // 4. 返回到首页(清空导航栈) Get.offAllNamed(Routes.KR_HOME); }, style: ElevatedButton.styleFrom( diff --git a/pubspec.yaml b/pubspec.yaml index 44966b6..1cbc898 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.0.4+112 +version: 0.0.4+113 environment: sdk: ">=3.5.0 <4.0.0"