import 'package:get/get.dart'; import 'package:flutter/material.dart'; import '../../../core/routes/app_routes.dart'; enum LoginViewState { welcome, // 欢迎页面 verification // 验证码页面 } class LoginController extends GetxController { static LoginController get to => Get.find(); // 状态管理 final _viewState = LoginViewState.welcome.obs; final _isLoading = false.obs; final _countdownSeconds = 0.obs; final _contactValue = ''.obs; final _displayContact = ''.obs; final _verificationCode = ['', '', '', ''].obs; // Getters LoginViewState get viewState => _viewState.value; bool get isLoading => _isLoading.value; int get countdownSeconds => _countdownSeconds.value; String get contactValue => _contactValue.value; String get displayContact => _displayContact.value; List get verificationCode => _verificationCode; // 文本控制器 final contactController = TextEditingController(); final verificationCodeController = TextEditingController(); @override void onInit() { super.onInit(); _viewState.value = LoginViewState.welcome; } @override void onClose() { contactController.dispose(); verificationCodeController.dispose(); super.onClose(); } // 获取验证码 void getVerificationCode() { if (contactController.text.isEmpty) { Get.snackbar( '提示', '请输入手机号码或邮箱', snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, ); return; } _contactValue.value = contactController.text; _formatDisplayContact(); _startCountdown(); _sendVerificationCode(); } // 使用验证码直接登录 void loginWithVerificationCode() { //测试期间暂时关闭验证码登录 // if (contactController.text.isEmpty) { // Get.snackbar( // '提示', // '请输入手机号码或邮箱', // snackPosition: SnackPosition.TOP, // backgroundColor: Colors.red.withOpacity(0.1), // colorText: Colors.red, // ); // return; // } // if (verificationCodeController.text.isEmpty) { // Get.snackbar( // '提示', // '请输入验证码', // snackPosition: SnackPosition.TOP, // backgroundColor: Colors.red.withOpacity(0.1), // colorText: Colors.red, // ); // return; // } // if (verificationCodeController.text.length < 6) { // Get.snackbar( // '提示', // '请输入完整的验证码', // snackPosition: SnackPosition.TOP, // backgroundColor: Colors.red.withOpacity(0.1), // colorText: Colors.red, // ); // return; // } _isLoading.value = true; // 模拟验证过程 Future.delayed(const Duration(seconds: 2), () { _isLoading.value = false; // 验证成功,跳转到配对页面 Get.offAllNamed(Routes.pairing); }); } // 切换到验证码页面 void showVerificationView() { if (contactController.text.isEmpty) { Get.snackbar( '提示', '请输入手机号码或邮箱', snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, ); return; } _contactValue.value = contactController.text; _formatDisplayContact(); _viewState.value = LoginViewState.verification; _startCountdown(); _sendVerificationCode(); } // 返回欢迎页面 void showWelcomeView() { _viewState.value = LoginViewState.welcome; _resetVerificationCode(); } // 格式化显示的联系方式(隐藏部分字符) void _formatDisplayContact() { String contact = _contactValue.value; if (contact.contains('@')) { // 邮箱 final parts = contact.split('@'); if (parts[0].length > 3) { _displayContact.value = parts[0].substring(0, 3) + '****@' + parts[1]; } else { _displayContact.value = contact; } } else if (RegExp(r'^\d+$').hasMatch(contact)) { // 手机号 if (contact.length > 7) { _displayContact.value = '+86 ' + contact.substring(0, 3) + '****' + contact.substring(contact.length - 4); } else { _displayContact.value = contact; } } else { _displayContact.value = contact; } } // 开始倒计时 void _startCountdown() { _countdownSeconds.value = 60; Future.doWhile(() async { await Future.delayed(const Duration(seconds: 1)); _countdownSeconds.value--; return _countdownSeconds.value > 0; }); } // 发送验证码 void _sendVerificationCode() { // 这里应该是实际发送验证码的逻辑 // 为了演示,我们只是模拟发送 } // 重新发送验证码 void resendVerificationCode() { if (_countdownSeconds.value > 0) return; _startCountdown(); _sendVerificationCode(); } // 更新验证码输入 void updateVerificationCode(int index, String value) { if (index >= 0 && index < 4) { var newList = [..._verificationCode]; newList[index] = value; _verificationCode.value = newList; } } // 重置验证码 void _resetVerificationCode() { _verificationCode.value = ['', '', '', '']; } // 检查验证码是否完整 bool isVerificationCodeComplete() { return !_verificationCode.contains(''); } // 登录 Future login() async { // 暂时关闭验证码验证 if (!isVerificationCodeComplete()) { Get.snackbar( '提示', '请输入完整的验证码', snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, ); return; } _isLoading.value = true; try { // 模拟验证过程 await Future.delayed(const Duration(seconds: 2)); // 验证成功,跳转到配对页面 Get.offAllNamed(Routes.pairing); } catch (e) { Get.snackbar( '错误', '登录失败,请重试', snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, ); } finally { _isLoading.value = false; } } // 使用密码登录 void usePasswordLogin() { // 这里可以实现密码登录的逻辑 Get.snackbar( '提示', '密码登录功能尚未实现', snackPosition: SnackPosition.TOP, backgroundColor: Colors.blue.withOpacity(0.1), colorText: Colors.blue, ); } }