From 09adc0052b42d0d67c591750aa7639934399bc18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Mon, 1 Dec 2025 16:32:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=92=8C=E5=80=92=E8=AE=A1=E6=97=B6=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E9=92=B1=E5=8C=85=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/mine/login_controller.dart | 44 +++++++++++++++++++++-- lib/pages/mine/login_page.dart | 5 +++ lib/pages/mine/my_wallet_page.dart | 1 + 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/lib/controller/mine/login_controller.dart b/lib/controller/mine/login_controller.dart index e502737..2d25f90 100644 --- a/lib/controller/mine/login_controller.dart +++ b/lib/controller/mine/login_controller.dart @@ -1,12 +1,13 @@ import 'dart:async'; import 'package:dating_touchme_app/controller/global.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import '../../network/user_api.dart'; import 'user_controller.dart'; -class LoginController extends GetxController { +class LoginController extends GetxController with WidgetsBindingObserver { // 手机号输入 final phoneNumber = ''.obs; // 验证码输入 @@ -18,6 +19,10 @@ class LoginController extends GetxController { // 是否正在登录中 final isLoggingIn = false.obs; + DateTime? startTime; + + Timer? codeTimer; + // 从GetX依赖注入中获取UserApi实例 late UserApi _userApi; // GetStorage实例,用于存储token等信息 @@ -28,6 +33,22 @@ class LoginController extends GetxController { super.onInit(); // 从全局依赖中获取UserApi _userApi = Get.find(); + + WidgetsBinding.instance.addObserver(this); + } + + @override + void onClose() { + super.onClose(); + WidgetsBinding.instance.removeObserver(this); + codeTimer?.cancel(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _recalcLeftSeconds(); // 回到前台时根据真实时间重新算一遍 + } } // 获取验证码 @@ -69,8 +90,9 @@ class LoginController extends GetxController { // 开始倒计时 void startCountdown() { + startTime = DateTime.now(); countdownSeconds.value = 60; - Timer.periodic(const Duration(seconds: 1), (timer) { + codeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { countdownSeconds.value--; if (countdownSeconds.value <= 0) { timer.cancel(); @@ -78,6 +100,24 @@ class LoginController extends GetxController { }); } + + + void _recalcLeftSeconds() { + + if (startTime == null) return; + + final now = DateTime.now(); + final diff = now.difference(startTime!).inSeconds; + final left = 60 - diff; + + if (left <= 0) { + countdownSeconds.value = 0; + codeTimer?.cancel(); + } else { + countdownSeconds.value = left; + } + } + // 清除错误信息 - 由于使用SmartDialog,此方法不再需要 // void clearErrorMessage() {} diff --git a/lib/pages/mine/login_page.dart b/lib/pages/mine/login_page.dart index 281c697..5d1e44b 100644 --- a/lib/pages/mine/login_page.dart +++ b/lib/pages/mine/login_page.dart @@ -1,5 +1,6 @@ import 'package:dating_touchme_app/generated/assets.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -77,6 +78,10 @@ class LoginPage extends StatelessWidget { counterText: '', ), keyboardType: TextInputType.phone, + inputFormatters: [ + // 只允许 0-9 + FilteringTextInputFormatter.digitsOnly, + ], maxLength: 11, onChanged: (value) { controller.phoneNumber.value = value; diff --git a/lib/pages/mine/my_wallet_page.dart b/lib/pages/mine/my_wallet_page.dart index 037578d..8bb27ad 100644 --- a/lib/pages/mine/my_wallet_page.dart +++ b/lib/pages/mine/my_wallet_page.dart @@ -49,6 +49,7 @@ class MyWalletPage extends StatelessWidget { controller.page.value = 1; controller.walletHistoryList.clear(); await controller.getHistoryList(); + await controller.getWalletData(); controller.listRefreshController.finishRefresh(IndicatorResult.success); controller.listRefreshController.finishLoad(IndicatorResult.none); },