From 00c47f22e049923b04fa9fbf67b60e56eef8fb1c Mon Sep 17 00:00:00 2001 From: Developer Date: Mon, 1 Dec 2025 19:33:05 -0800 Subject: [PATCH] . --- .../auth/presentation/pages/guide_page.dart | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/frontend/mobile-app/lib/features/auth/presentation/pages/guide_page.dart b/frontend/mobile-app/lib/features/auth/presentation/pages/guide_page.dart index fd07ee99..96592dec 100644 --- a/frontend/mobile-app/lib/features/auth/presentation/pages/guide_page.dart +++ b/frontend/mobile-app/lib/features/auth/presentation/pages/guide_page.dart @@ -213,6 +213,7 @@ class _GuidePageState extends ConsumerState { Widget _buildWelcomePage() { return _WelcomePageContent( onNext: _goToOnboarding, + onExit: _goToOnboarding, // 退出也跳转到 onboarding ); } @@ -241,8 +242,12 @@ class _GuidePageState extends ConsumerState { /// 欢迎加入页面内容 (第5页) class _WelcomePageContent extends StatefulWidget { final VoidCallback onNext; + final VoidCallback onExit; - const _WelcomePageContent({required this.onNext}); + const _WelcomePageContent({ + required this.onNext, + required this.onExit, + }); @override State<_WelcomePageContent> createState() => _WelcomePageContentState(); @@ -252,12 +257,55 @@ class _WelcomePageContentState extends State<_WelcomePageContent> { bool _hasReferrer = true; final TextEditingController _referralCodeController = TextEditingController(); + @override + void initState() { + super.initState(); + // 监听输入框变化以更新按钮状态 + _referralCodeController.addListener(_onReferralCodeChanged); + } + @override void dispose() { + _referralCodeController.removeListener(_onReferralCodeChanged); _referralCodeController.dispose(); super.dispose(); } + /// 输入框内容变化时刷新UI + void _onReferralCodeChanged() { + setState(() {}); + } + + /// 验证推荐码是否有效 + /// 支持: 纯推荐码(至少3个字符) 或 合法URL + bool _isValidReferralCode(String code) { + final trimmed = code.trim(); + if (trimmed.isEmpty) return false; + + // 如果是URL格式,检查是否能解析 + if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) { + try { + final uri = Uri.parse(trimmed); + // URL必须有路径或查询参数 + return uri.pathSegments.isNotEmpty || uri.queryParameters.isNotEmpty; + } catch (e) { + return false; + } + } + + // 纯推荐码至少3个字符 + return trimmed.length >= 3; + } + + /// 判断按钮是否可点击 + bool get _canProceed { + // 如果选择"没有推荐人",按钮可点击 + if (!_hasReferrer) return true; + + // 如果选择"有推荐人",需要填写有效的推荐码 + return _isValidReferralCode(_referralCodeController.text); + } + /// 打开二维码扫描页面 Future _openQrScanner() async { final result = await Navigator.of(context).push( @@ -342,10 +390,7 @@ class _WelcomePageContentState extends State<_WelcomePageContent> { child: Padding( padding: EdgeInsets.only(top: 32.h), child: GestureDetector( - onTap: () { - // 退出向导 - Navigator.of(context).maybePop(); - }, + onTap: widget.onExit, child: Text( '退出 Exit', style: TextStyle( @@ -383,7 +428,7 @@ class _WelcomePageContentState extends State<_WelcomePageContent> { const Spacer(), // 下一步按钮 GestureDetector( - onTap: widget.onNext, + onTap: _canProceed ? widget.onNext : null, child: Container( width: double.infinity, padding: EdgeInsets.symmetric(vertical: 16.h), @@ -393,7 +438,9 @@ class _WelcomePageContentState extends State<_WelcomePageContent> { fontSize: 16.sp, fontWeight: FontWeight.w500, height: 1.5, - color: const Color(0xFFD9C8A9), + color: _canProceed + ? const Color(0xFFD4A84B) // 金色 - 可点击 + : const Color(0xFFCCC5B9), // 灰色 - 不可点击 ), textAlign: TextAlign.right, ),