hi-client/lib/app/modules/kr_invite/views/kr_invite_view.dart

253 lines
14 KiB
Dart
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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';
import 'package:kaer_with_panels/app/common/app_run_data.dart';
class KRInviteView extends GetView<KRInviteController> {
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: isKeyboardVisible
? const ClampingScrollPhysics()
: 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'
'请在浏览器输入${KRAppRunData.getInstance().shareUrl.value}下载#';
if (GetPlatform.isIOS) {
Share.share(text, subject: '直接分享Hi快VPN邀请链接');
} else {
Clipboard.setData(ClipboardData(text: text));
KRCommonUtil.kr_showToast(AppTranslations.kr_invite.inviteCodeCopied);
}
}
},
),
],
),
),
),
SizedBox(height: 40.w),
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,
contextMenuBuilder: (context, editableTextState) => const SizedBox.shrink(),
textInputAction: TextInputAction.done,
onSubmitted: (_) => controller.kr_handleBindInviteCode(),
textAlign: TextAlign.center,
maxLength: 10,
style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
decoration: InputDecoration(
counterText: '',
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),
),
),
),
if (!isKeyboardVisible) ...[
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: isKeyboardVisible ? 20.w : 90.w),
],
),
),
),
),
);
},
),
),
// 2. 🟢 修正:为了防止遮挡输入框,当键盘弹出时彻底隐藏该悬浮组件
// 使用 Visibility 配合 maintainState避免因组件销毁导致的定位状态丢失
Visibility(
visible: !isKeyboardVisible,
child: const HIHelpEntrance(),
),
],
),
),
);
}
}