feat(kyc): 首次验证手机号成功后显示选择页面
- 添加 verifySuccess 步骤替代弹窗 - 显示"恭喜您!手机号已验证成功" - 提供两个选择按钮: - "仅验证手机号,不更换" - 返回上一页 - "继续更换手机号" - 进入输入新手机号步骤 - 已验证过的用户直接进入更换流程 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
941253dd77
commit
a51fa39a2d
|
|
@ -8,10 +8,11 @@ import 'kyc_entry_page.dart'; // 导入 kycServiceProvider
|
||||||
|
|
||||||
/// 更换手机号流程步骤
|
/// 更换手机号流程步骤
|
||||||
enum ChangePhoneStep {
|
enum ChangePhoneStep {
|
||||||
verifyOld, // 验证旧手机
|
verifyOld, // 验证旧手机
|
||||||
inputNew, // 输入新手机号
|
verifySuccess, // 验证成功,选择下一步操作(仅当首次验证时显示)
|
||||||
verifyNew, // 验证新手机
|
inputNew, // 输入新手机号
|
||||||
success, // 更换成功
|
verifyNew, // 验证新手机
|
||||||
|
success, // 更换成功
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 更换手机号页面
|
/// 更换手机号页面
|
||||||
|
|
@ -149,15 +150,16 @@ class _ChangePhonePageState extends ConsumerState<ChangePhonePage> {
|
||||||
_countdown = 0;
|
_countdown = 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 如果之前手机号未验证过,现在首次验证成功,显示恭喜弹窗
|
// 根据之前是否已验证决定跳转到哪个步骤
|
||||||
if (!response.wasAlreadyVerified && mounted) {
|
|
||||||
await _showCongratulationsDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 进入下一步
|
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_currentStep = ChangePhoneStep.inputNew;
|
if (!response.wasAlreadyVerified) {
|
||||||
|
// 首次验证成功,显示选择页面
|
||||||
|
_currentStep = ChangePhoneStep.verifySuccess;
|
||||||
|
} else {
|
||||||
|
// 之前已验证过,直接进入更换手机号流程
|
||||||
|
_currentStep = ChangePhoneStep.inputNew;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -176,114 +178,6 @@ class _ChangePhonePageState extends ConsumerState<ChangePhonePage> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 显示恭喜弹窗(首次验证手机号成功)
|
|
||||||
Future<void> _showCongratulationsDialog() async {
|
|
||||||
return showDialog(
|
|
||||||
context: context,
|
|
||||||
barrierDismissible: false,
|
|
||||||
builder: (context) => AlertDialog(
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
|
||||||
),
|
|
||||||
content: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
SizedBox(height: 16.h),
|
|
||||||
Container(
|
|
||||||
width: 64.w,
|
|
||||||
height: 64.w,
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
color: Color(0xFFE8F5E9),
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
),
|
|
||||||
child: Icon(
|
|
||||||
Icons.check_circle,
|
|
||||||
color: const Color(0xFF2E7D32),
|
|
||||||
size: 40.sp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 16.h),
|
|
||||||
Text(
|
|
||||||
'恭喜您!',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 20.sp,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
color: const Color(0xFF333333),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
Text(
|
|
||||||
'您的手机号已验证成功',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 14.sp,
|
|
||||||
color: const Color(0xFF666666),
|
|
||||||
),
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
Text(
|
|
||||||
'您可以继续更换新手机号,或点击返回完成验证',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF999999),
|
|
||||||
),
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
SizedBox(height: 24.h),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: OutlinedButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(); // 关闭弹窗
|
|
||||||
this.context.pop(); // 返回上一页
|
|
||||||
},
|
|
||||||
style: OutlinedButton.styleFrom(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 12.h),
|
|
||||||
side: const BorderSide(color: Color(0xFF2E7D32)),
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Text(
|
|
||||||
'完成',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 14.sp,
|
|
||||||
color: const Color(0xFF2E7D32),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 12.w),
|
|
||||||
Expanded(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(); // 关闭弹窗,继续更换手机号流程
|
|
||||||
},
|
|
||||||
style: ElevatedButton.styleFrom(
|
|
||||||
backgroundColor: const Color(0xFF2E7D32),
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 12.h),
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Text(
|
|
||||||
'继续更换',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 14.sp,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 发送新手机验证码
|
/// 发送新手机验证码
|
||||||
Future<void> _sendNewPhoneCode() async {
|
Future<void> _sendNewPhoneCode() async {
|
||||||
final newPhone = _newPhoneController.text.trim();
|
final newPhone = _newPhoneController.text.trim();
|
||||||
|
|
@ -415,6 +309,8 @@ class _ChangePhonePageState extends ConsumerState<ChangePhonePage> {
|
||||||
switch (_currentStep) {
|
switch (_currentStep) {
|
||||||
case ChangePhoneStep.verifyOld:
|
case ChangePhoneStep.verifyOld:
|
||||||
return _buildVerifyOldStep();
|
return _buildVerifyOldStep();
|
||||||
|
case ChangePhoneStep.verifySuccess:
|
||||||
|
return _buildVerifySuccessStep();
|
||||||
case ChangePhoneStep.inputNew:
|
case ChangePhoneStep.inputNew:
|
||||||
return _buildInputNewStep();
|
return _buildInputNewStep();
|
||||||
case ChangePhoneStep.verifyNew:
|
case ChangePhoneStep.verifyNew:
|
||||||
|
|
@ -477,6 +373,159 @@ class _ChangePhonePageState extends ConsumerState<ChangePhonePage> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 验证成功选择页面(首次验证手机号后显示)
|
||||||
|
Widget _buildVerifySuccessStep() {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 24.w),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: 60.h),
|
||||||
|
// 成功图标
|
||||||
|
Container(
|
||||||
|
width: 80.w,
|
||||||
|
height: 80.w,
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: Color(0xFFE8F5E9),
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
),
|
||||||
|
child: Icon(
|
||||||
|
Icons.check_circle,
|
||||||
|
color: const Color(0xFF2E7D32),
|
||||||
|
size: 50.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 24.h),
|
||||||
|
Text(
|
||||||
|
'恭喜您!',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 28.sp,
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
color: const Color(0xFF333333),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 12.h),
|
||||||
|
Text(
|
||||||
|
'您的手机号已验证成功',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16.sp,
|
||||||
|
color: const Color(0xFF666666),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (_oldPhoneNumber != null) ...[
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
Text(
|
||||||
|
_oldPhoneNumber!,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: const Color(0xFF2E7D32),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
SizedBox(height: 48.h),
|
||||||
|
Text(
|
||||||
|
'请选择下一步操作',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.sp,
|
||||||
|
color: const Color(0xFF999999),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 24.h),
|
||||||
|
// 仅验证手机号按钮
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: OutlinedButton(
|
||||||
|
onPressed: () {
|
||||||
|
context.pop(); // 返回上一页
|
||||||
|
},
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 16.h),
|
||||||
|
side: const BorderSide(color: Color(0xFF2E7D32), width: 1.5),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.check, color: const Color(0xFF2E7D32), size: 20.sp),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
|
Text(
|
||||||
|
'仅验证手机号,不更换',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: const Color(0xFF2E7D32),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
// 继续更换手机号按钮
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
_currentStep = ChangePhoneStep.inputNew;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: const Color(0xFF2E7D32),
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 16.h),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.swap_horiz, color: Colors.white, size: 20.sp),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
|
Text(
|
||||||
|
'继续更换手机号',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 32.h),
|
||||||
|
// 提示文字
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16.w),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: const Color(0xFFF5F5F5),
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(Icons.info_outline, color: const Color(0xFF999999), size: 18.sp),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'如需更换手机号,验证码将发送至新手机',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12.sp,
|
||||||
|
color: const Color(0xFF666666),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// 步骤2: 输入新手机号
|
/// 步骤2: 输入新手机号
|
||||||
Widget _buildInputNewStep() {
|
Widget _buildInputNewStep() {
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue