This commit is contained in:
Developer 2025-12-01 19:33:05 -08:00
parent 9944f86174
commit 00c47f22e0
1 changed files with 54 additions and 7 deletions

View File

@ -213,6 +213,7 @@ class _GuidePageState extends ConsumerState<GuidePage> {
Widget _buildWelcomePage() { Widget _buildWelcomePage() {
return _WelcomePageContent( return _WelcomePageContent(
onNext: _goToOnboarding, onNext: _goToOnboarding,
onExit: _goToOnboarding, // 退 onboarding
); );
} }
@ -241,8 +242,12 @@ class _GuidePageState extends ConsumerState<GuidePage> {
/// (5) /// (5)
class _WelcomePageContent extends StatefulWidget { class _WelcomePageContent extends StatefulWidget {
final VoidCallback onNext; final VoidCallback onNext;
final VoidCallback onExit;
const _WelcomePageContent({required this.onNext}); const _WelcomePageContent({
required this.onNext,
required this.onExit,
});
@override @override
State<_WelcomePageContent> createState() => _WelcomePageContentState(); State<_WelcomePageContent> createState() => _WelcomePageContentState();
@ -252,12 +257,55 @@ class _WelcomePageContentState extends State<_WelcomePageContent> {
bool _hasReferrer = true; bool _hasReferrer = true;
final TextEditingController _referralCodeController = TextEditingController(); final TextEditingController _referralCodeController = TextEditingController();
@override
void initState() {
super.initState();
//
_referralCodeController.addListener(_onReferralCodeChanged);
}
@override @override
void dispose() { void dispose() {
_referralCodeController.removeListener(_onReferralCodeChanged);
_referralCodeController.dispose(); _referralCodeController.dispose();
super.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<void> _openQrScanner() async { Future<void> _openQrScanner() async {
final result = await Navigator.of(context).push<String>( final result = await Navigator.of(context).push<String>(
@ -342,10 +390,7 @@ class _WelcomePageContentState extends State<_WelcomePageContent> {
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 32.h), padding: EdgeInsets.only(top: 32.h),
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: widget.onExit,
// 退
Navigator.of(context).maybePop();
},
child: Text( child: Text(
'退出 Exit', '退出 Exit',
style: TextStyle( style: TextStyle(
@ -383,7 +428,7 @@ class _WelcomePageContentState extends State<_WelcomePageContent> {
const Spacer(), const Spacer(),
// //
GestureDetector( GestureDetector(
onTap: widget.onNext, onTap: _canProceed ? widget.onNext : null,
child: Container( child: Container(
width: double.infinity, width: double.infinity,
padding: EdgeInsets.symmetric(vertical: 16.h), padding: EdgeInsets.symmetric(vertical: 16.h),
@ -393,7 +438,9 @@ class _WelcomePageContentState extends State<_WelcomePageContent> {
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
height: 1.5, height: 1.5,
color: const Color(0xFFD9C8A9), color: _canProceed
? const Color(0xFFD4A84B) // -
: const Color(0xFFCCC5B9), // -
), ),
textAlign: TextAlign.right, textAlign: TextAlign.right,
), ),