import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:kaer_with_panels/app/common/app_config.dart'; import 'package:kaer_with_panels/app/localization/app_translations.dart'; import 'package:kaer_with_panels/app/widgets/kr_local_image.dart'; import '../controllers/kr_invite_controller.dart'; import 'package:flutter/services.dart'; import 'package:share_plus/share_plus.dart'; import 'package:kaer_with_panels/app/utils/kr_common_util.dart'; import 'package:kaer_with_panels/app/widgets/hi_base_scaffold.dart'; import 'package:kaer_with_panels/app/widgets/hi_help_entrance.dart'; class KRInviteView extends GetView { const KRInviteView({super.key}); @override Widget build(BuildContext context) { // 监听键盘高度,仅用于控制悬浮按钮的可见性 final bool isKeyboardVisible = MediaQuery.of(context).viewInsets.bottom > 0; return HIBaseScaffold( resizeToAvoidBottomInset: true, child: GestureDetector( // 允许点击空白处收起键盘 onTap: () => FocusScope.of(context).unfocus(), behavior: HitTestBehavior.translucent, child: Stack( children: [ // 1. 背景层/滚动层 Positioned.fill( child: LayoutBuilder( builder: (context, constraints) { return SingleChildScrollView( physics: const NeverScrollableScrollPhysics(), child: ConstrainedBox( constraints: BoxConstraints(minHeight: constraints.maxHeight), child: IntrinsicHeight( child: Padding( padding: EdgeInsets.symmetric(horizontal: 40.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 20.w), // 🟢 第一行:奖励说明 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, 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); } } }, ), ], ), ), ), const Spacer(), // 🟢 第三部分:接受他人邀请 Obx(() { // 只有当没有被邀请时才显示 if (controller.kr_refererId.value != 0) { return const SizedBox.shrink(); } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '接受他人邀请', style: TextStyle( color: Colors.white, fontSize: 14.sp, fontWeight: FontWeight.bold, ), ), SizedBox(height: 8.h), 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: 90.w), ], ), ), ), ), ); }, ), ), // 2. 🟢 修正:为了防止遮挡输入框,当键盘弹出时彻底隐藏该悬浮组件 // 使用 Visibility 配合 maintainState,避免因组件销毁导致的定位状态丢失 Visibility( visible: !isKeyboardVisible, child: const HIHelpEntrance(), ), ], ), ), ); } }