|
|
@@ -4,10 +4,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
import 'package:go_router/go_router.dart';
|
|
|
import 'package:sino_med_cloud/l10n/app_localizations.dart';
|
|
|
import 'package:sino_med_cloud/core/constants/app_constants.dart';
|
|
|
+import 'package:sino_med_cloud/core/utils/toast_utils.dart'; // 添加 ToastUtils 引用
|
|
|
import '../../../core/utils/logger.dart';
|
|
|
import '../../../core/utils/crypto_utils.dart';
|
|
|
import '../domain/login_service.dart';
|
|
|
-import 'login_provider.dart';
|
|
|
+import '../data/login_provider.dart';
|
|
|
|
|
|
class LoginPage extends ConsumerStatefulWidget {
|
|
|
const LoginPage({super.key});
|
|
|
@@ -110,9 +111,7 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
final l10n = AppLocalizations.of(context)!;
|
|
|
final phone = ref.read(smsLoginPhoneProvider);
|
|
|
if (phone.isEmpty) {
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(l10n.phoneNumberRequiredForSms)),
|
|
|
- );
|
|
|
+ ToastUtils.show(l10n.phoneNumberRequiredForSms);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -155,9 +154,7 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
} catch (e) {
|
|
|
AppLogger.e('发送验证码错误', e);
|
|
|
if (mounted) {
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(e.toString())),
|
|
|
- );
|
|
|
+ ToastUtils.showError(e.toString());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -167,12 +164,14 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
try {
|
|
|
// 当前手机号及密码的格式已经验证过
|
|
|
if (_passwordFormKey.currentState!.validate()) {
|
|
|
- final phoneNumber = ref.watch(passwordLoginPhoneProvider);
|
|
|
- final password = ref.watch(passwordLoginPasswordProvider);
|
|
|
+ // 在异步方法中应使用 ref.read
|
|
|
+ final phoneNumber = ref.read(passwordLoginPhoneProvider);
|
|
|
+ final password = ref.read(passwordLoginPasswordProvider);
|
|
|
|
|
|
// 对密码进行 MD5 加密
|
|
|
final encryptedPassword = CryptoUtils.md5(password);
|
|
|
|
|
|
+ AppLogger.d('开始密码登录请求: $phoneNumber');
|
|
|
// 调用登录服务
|
|
|
await LoginService.passwordLogin(
|
|
|
mobile: phoneNumber,
|
|
|
@@ -180,19 +179,16 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
loginSystem: _loginSystem,
|
|
|
loginType: _loginType,
|
|
|
);
|
|
|
-
|
|
|
+ AppLogger.d('密码登录成功,准备跳转主页');
|
|
|
// 登录成功,跳转到主页
|
|
|
if (mounted) {
|
|
|
- context.replace('/mainTab');
|
|
|
+ context.go('/mainTab');
|
|
|
}
|
|
|
}
|
|
|
- } catch (e) {
|
|
|
- AppLogger.e('密码登录错误', e);
|
|
|
+ } catch (e, stack) {
|
|
|
+ AppLogger.e('密码登录错误', e, stack);
|
|
|
if (mounted) {
|
|
|
- final l10n = AppLocalizations.of(context)!;
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(e.toString())),
|
|
|
- );
|
|
|
+ ToastUtils.showError(e.toString().replaceAll('Exception: ', ''));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -203,27 +199,25 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
final l10n = AppLocalizations.of(context)!;
|
|
|
|
|
|
if (_smsFormKey.currentState!.validate()) {
|
|
|
- final smsCode = ref.watch(smsLoginCodeProvider);
|
|
|
+ // 在异步方法中应使用 ref.read
|
|
|
+ final smsCode = ref.read(smsLoginCodeProvider);
|
|
|
final serverSmsCode = ref.read(smsCodeFromServerProvider);
|
|
|
|
|
|
// 检查验证码是否已过期(为空或倒计时已结束)
|
|
|
if (serverSmsCode.isEmpty) {
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(l10n.smsCodeHasExpired)),
|
|
|
- );
|
|
|
+ ToastUtils.show(l10n.smsCodeHasExpired);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 验证码输入错误
|
|
|
if (smsCode != serverSmsCode) {
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(l10n.smsCodeError)),
|
|
|
- );
|
|
|
+ ToastUtils.showError(l10n.smsCodeError);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- final phoneNumber = ref.watch(smsLoginPhoneProvider);
|
|
|
+ final phoneNumber = ref.read(smsLoginPhoneProvider);
|
|
|
|
|
|
+ AppLogger.d('开始验证码登录请求: $phoneNumber');
|
|
|
// 调用登录服务
|
|
|
await LoginService.smsLogin(
|
|
|
mobile: phoneNumber,
|
|
|
@@ -232,6 +226,7 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
loginType: _loginSmsType,
|
|
|
);
|
|
|
|
|
|
+ AppLogger.d('验证码登录成功,清理状态并跳转主页');
|
|
|
// 登录成功,清理倒计时和定时器
|
|
|
_clearCountdownTimer();
|
|
|
ref.read(smsCountdownProvider.notifier).state = 0;
|
|
|
@@ -240,16 +235,13 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
|
|
|
// 跳转到主页
|
|
|
if (mounted) {
|
|
|
- context.replace('/mainTab');
|
|
|
+ context.go('/mainTab');
|
|
|
}
|
|
|
}
|
|
|
- } catch (e) {
|
|
|
- AppLogger.e('验证码登录错误', e);
|
|
|
+ } catch (e, stack) {
|
|
|
+ AppLogger.e('验证码登录错误', e, stack);
|
|
|
if (mounted) {
|
|
|
- final l10n = AppLocalizations.of(context)!;
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(e.toString())),
|
|
|
- );
|
|
|
+ ToastUtils.showError(e.toString().replaceAll('Exception: ', ''));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -417,10 +409,10 @@ class _LoginPageState extends ConsumerState<LoginPage>
|
|
|
alignment: Alignment.centerRight,
|
|
|
child: TextButton(
|
|
|
onPressed: () {
|
|
|
- // TODO: 跳转到忘记密码页面
|
|
|
- ScaffoldMessenger.of(context).showSnackBar(
|
|
|
- SnackBar(content: Text(l10n.forgotPasswordNotImplemented)),
|
|
|
- );
|
|
|
+ // 跳转到忘记密码页面
|
|
|
+ if (mounted) {
|
|
|
+ context.push('/ChangePassword');
|
|
|
+ }
|
|
|
},
|
|
|
child: Text(l10n.forgotPassword),
|
|
|
),
|