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/common/app_run_data.dart'; import 'package:kaer_with_panels/app/localization/app_translations.dart'; import 'package:kaer_with_panels/app/widgets/kr_app_text_style.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:kaer_with_panels/app/utils/kr_common_util.dart'; import 'package:easy_refresh/easy_refresh.dart'; class _KRSliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate { final Widget child; final double maxHeight; final double minHeight; _KRSliverPersistentHeaderDelegate({ required this.child, required this.maxHeight, required this.minHeight, }); @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { return SizedBox.expand(child: child); } @override double get maxExtent => maxHeight; @override double get minExtent => minHeight; @override bool shouldRebuild(_KRSliverPersistentHeaderDelegate oldDelegate) { return maxHeight != oldDelegate.maxHeight || minHeight != oldDelegate.minHeight || child != oldDelegate.child; } } class KRInviteView extends GetView { const KRInviteView({super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Theme.of(context).primaryColor, body: Obx(() { // 使用 Obx 响应式监听登录状态 final appRunData = KRAppRunData.getInstance(); final isDeviceLogin = appRunData.isDeviceLogin(); final isLoggedIn = appRunData.kr_isLogin.value && !isDeviceLogin; if (!isLoggedIn) { // 未登录或设备登录,显示空白页面并触发对话框 // 使用 WidgetsBinding 确保在构建完成后调用 WidgetsBinding.instance.addPostFrameCallback((_) { controller.kr_onPageEnter(); }); return Container(); // 空白容器 } // 正常登录用户显示邀请页面内容 return EasyRefresh( controller: controller.refreshController, onRefresh: controller.kr_onRefresh, header: DeliveryHeader( triggerOffset: 50.0, springRebound: true, ), child: CustomScrollView( physics: const BouncingScrollPhysics(), slivers: [ SliverAppBar( expandedHeight: 150.w, floating: false, pinned: true, stretch: true, backgroundColor: Colors.transparent, automaticallyImplyLeading: false, flexibleSpace: FlexibleSpaceBar( background: Stack( fit: StackFit.expand, children: [ Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.blue, Colors.blue.shade400, Colors.blue.shade200, Theme.of(context).primaryColor, ], stops: const [0.0, 0.3, 0.7, 1.0], ), ), ), Positioned( bottom: -50.w, child: KrLocalImage( imageName: "invite_top_bg", width: 344.w, height: 233.w, fit: BoxFit.contain, imageType: ImageType.png, ), ), Positioned( top: MediaQuery.of(context).padding.top + 16.w, left: 16.w, child: Text( AppTranslations.kr_invite.title, style: KrAppTextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, ), ), ), ], ), ), ), SliverPersistentHeader( delegate: _KRSliverPersistentHeaderDelegate( maxHeight: 120.w, minHeight: 120.w, child: Container( color: Theme.of(context).primaryColor, padding: EdgeInsets.symmetric(horizontal: 16.w), child: _kr_buildProgressCard(context), ), ), pinned: true, ), SliverToBoxAdapter( child: SingleChildScrollView( child: Container( color: Theme.of(context).primaryColor, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _kr_buildInviteSteps(context), _kr_buildShareButtons(context), _kr_buildInviteRules(context), SizedBox(height: 20.w), ], ), ), ), ), ], ), ); }), // 闭合 Obx ); } Widget _kr_buildProgressCard(BuildContext context) { return Container( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w), decoration: BoxDecoration( color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(12.w), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 8.w, offset: Offset(0, 2.w), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( AppTranslations.kr_invite.inviteStats, style: KrAppTextStyle( fontSize: 15, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), Container( padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.w), decoration: BoxDecoration( color: Colors.blue.withOpacity(0.1), borderRadius: BorderRadius.circular(4.w), ), child: Obx(() => Text( controller.kr_progress.value.registers.toString(), style: KrAppTextStyle( fontSize: 13, fontWeight: FontWeight.w500, color: Colors.blue, ), )), ), ], ), SizedBox(height: 12.w), Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppTranslations.kr_invite.registers, style: KrAppTextStyle( fontSize: 13, color: Theme.of(context).textTheme.bodySmall?.color, ), ), SizedBox(height: 4.w), Obx(() => Text( controller.kr_progress.value.registers.toString(), style: KrAppTextStyle( fontSize: 17, fontWeight: FontWeight.w600, color: Theme.of(context).textTheme.bodyMedium?.color, ), )), ], ), ), SizedBox(width: 16.w), Expanded( child: Visibility( visible: AppConfig().kr_is_daytime, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppTranslations.kr_invite.totalCommission, style: KrAppTextStyle( fontSize: 13, color: Theme.of(context).textTheme.bodySmall?.color, ), ), SizedBox(height: 4.w), Text( controller.kr_progress.value.totalCommission.toString(), style: KrAppTextStyle( fontSize: 17, fontWeight: FontWeight.w600, color: Colors.blue, ), ), ], ), ), ), ], ), ], ), ); } Widget _kr_buildInviteSteps(BuildContext context) { return Padding( padding: EdgeInsets.fromLTRB(16.w, 32.w, 16.w, 16.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( AppTranslations.kr_invite.steps, style: KrAppTextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), ], ), SizedBox(height: 16.w), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _kr_buildStepCard(context, Icons.person_add, AppTranslations.kr_invite.inviteFriend), _kr_buildStepCard(context, Icons.mail, AppTranslations.kr_invite.acceptInvite), _kr_buildStepCard(context, Icons.card_giftcard, AppTranslations.kr_invite.getReward), ], ), ], ), ); } Widget _kr_buildStepCard(BuildContext context, IconData icon, String text) { return Container( width: 100.w, padding: EdgeInsets.all(12.r), decoration: BoxDecoration( color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10.r, offset: Offset(0, 2.w), ), ], ), child: Column( children: [ Container( width: 48.r, height: 48.r, decoration: BoxDecoration( color: Colors.blue.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon(icon, color: Colors.blue, size: 24.r), ), SizedBox(height: 8.w), Text( text, textAlign: TextAlign.center, style: KrAppTextStyle( fontSize: 12, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), ], ), ); } Widget _kr_buildShareButtons(BuildContext context) { return Padding( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.w), child: Column( children: [ Row( children: [ Expanded( child: ElevatedButton.icon( onPressed: controller.kr_handleLinkShare, icon: Icon(Icons.link, size: 20.r, color: Colors.white), label: FittedBox( fit: BoxFit.scaleDown, child: Text( AppTranslations.kr_invite.shareLink, style: TextStyle( fontSize: 14.sp, color: Colors.white, fontWeight: FontWeight.w500, ), ), ), style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF2196F3), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(24.r), ), ), ), ), SizedBox(width: 16.w), Expanded( child: ElevatedButton.icon( onPressed: controller.kr_handleQRShare, icon: Icon(Icons.qr_code, size: 20.r, color: Colors.white), label: FittedBox( fit: BoxFit.scaleDown, child: Text( AppTranslations.kr_invite.shareQR, style: TextStyle( fontSize: 14.sp, color: Colors.white, fontWeight: FontWeight.w500, ), ), ), style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF2196F3), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.w), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(24.r), ), ), ), ), ], ), SizedBox(height: 16.w), Obx(() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '${AppTranslations.kr_invite.myInviteCode}: ${controller.kr_referCode.value}', style: KrAppTextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), IconButton( icon: Icon(Icons.copy, size: 20.r, color: Colors.blue), onPressed: () { Clipboard.setData(ClipboardData(text: controller.kr_referCode.value)); KRCommonUtil.kr_showToast( AppTranslations.kr_invite.inviteCodeCopied, ); }, ), ], ); }), ], ), ); } Widget _kr_buildInviteRules(BuildContext context) { return Padding( padding: EdgeInsets.all(16.r), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppTranslations.kr_invite.rules, style: KrAppTextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), SizedBox(height: 16.w), Text( AppTranslations.kr_invite.rule1, style: KrAppTextStyle( fontSize: 12, fontWeight: FontWeight.w400, color: Theme.of(context).textTheme.bodySmall?.color, ), ), SizedBox(height: 8.w), Text( AppTranslations.kr_invite.rule2, style: KrAppTextStyle( fontSize: 12, fontWeight: FontWeight.w400, color: Theme.of(context).textTheme.bodySmall?.color, ), ), ], ), ); } }