Browse Source

fix(login): 修复登录视图点击空白处键盘不收起的问题

refactor(login): 优化登录请求处理逻辑,增加超时和错误处理
- 为登录请求添加30秒超时控制
- 完善错误处理,增加用户友好的错误提示
- 添加finally块确保加载状态重置

refactor(version): 简化版本更新服务逻辑,默认使用官方下载
weicu
lxm 1 year ago
parent
commit
abf286475b
  1. 42
      lib/data/services/version_update_service.dart
  2. 119
      lib/modules/login/controllers/login_controller.dart
  3. 17
      lib/modules/login/views/login_view.dart

42
lib/data/services/version_update_service.dart

@ -270,29 +270,29 @@ class VersionUpdateService extends GetxService {
return false;
}
final platformInfo = await getCurrentPlatformInfo();
//final platformInfo = await getCurrentPlatformInfo();
try {
switch (platformInfo.storeType) {
case AppStoreType.appStore:
return await _openAppStore();
case AppStoreType.googlePlay:
return await _openGooglePlay();
case AppStoreType.huawei:
return await _openHuaweiStore();
case AppStoreType.xiaomi:
return await _openXiaomiStore();
case AppStoreType.oppo:
return await _openOppoStore();
case AppStoreType.vivo:
return await _openVivoStore();
case AppStoreType.honor:
return await _openHonorStore();
case AppStoreType.official:
return await _openOfficialDownload(updateInfo.appInfo!.address!);
default:
return await _openOfficialDownload(updateInfo.appInfo!.address!);
}
// switch (platformInfo.storeType) {
// case AppStoreType.appStore:
// return await _openAppStore();
// case AppStoreType.googlePlay:
// return await _openGooglePlay();
// case AppStoreType.huawei:
// return await _openHuaweiStore();
// case AppStoreType.xiaomi:
// return await _openXiaomiStore();
// case AppStoreType.oppo:
// return await _openOppoStore();
// case AppStoreType.vivo:
// return await _openVivoStore();
// case AppStoreType.honor:
// return await _openHonorStore();
// case AppStoreType.official:
// return await _openOfficialDownload(updateInfo.appInfo!.address!);
// default:
return await _openOfficialDownload(updateInfo.appInfo!.address!);
// }
} catch (e) {
_logger.e('执行更新失败: $e');
return false;

119
lib/modules/login/controllers/login_controller.dart

@ -1,3 +1,5 @@
import 'dart:async';
import '../../../data/models/appconfig.dart';
import '../../../data/models/appconfig_model.dart';
import 'package:get/get.dart';
@ -815,54 +817,79 @@ class LoginController extends GetxController {
// 使用登陆请求服务器
Future<void> requestLogin(Map params) async {
Logger().d("请求后台数据login=$params");
var response = await Api.login({
"mail": params["mail"],
"phone": params["phone"],
"stype": params["stype"],
"vcode": params["vcode"],
"ttoken": params["ttoken"],
"phonemodel": _appVersion + _countryCode + _userChannel.toString(),
"phonemac": params["phonemac"],
"name": params["name"],
"avatar": params["avatar"],
});
if (response != null) {
Logger().d("请求后台数据login回复数据=$response");
// final instance = await GetStorage();
await _storage.write('loginInfo', jsonEncode(response));
// 2. 将响应数据转换为User对象
try {
Logger().d('响应数据: ${response.toString()}'); // 调试输出原始数据
if (response['token'].toString() != '') {
// 新增:检查 user 字段是否存在且类型正确
// if (response.containsKey('data') && response['data'] is Map) {
final user = User.fromJson(response);
Logger().d('用户初始化成功: ${response['token'].toString()}');
await _storage.write("logintoken", response['token'].toString());
// 存储到 SharedPreferences (仅存储用户数据)
//final prefs = await GetStorage();
await _storage.write('user_info', user.toJson());
//获取app的配置信息
await getAppConfig();
Get.offAllNamed(Routes.pairing);
// } else {
// throw FormatException('API 响应缺少 user 字段');
// }
} else {
throw Exception('接口返回错误: ${response['msg']}');
try {
Logger().d("请求后台数据login=$params");
// 在Api.login调用时添加超时
var response = await Api.login({
"mail": params["mail"],
"phone": params["phone"],
"stype": params["stype"],
"vcode": params["vcode"],
"ttoken": params["ttoken"],
"phonemodel": _appVersion + _countryCode + _userChannel.toString(),
"phonemac": params["phonemac"],
"name": params["name"],
"avatar": params["avatar"],
}).timeout(
const Duration(seconds: 30), // 30秒超时
onTimeout: () {
throw TimeoutException('登录请求超时', const Duration(seconds: 30));
},
);
if (response != null) {
Logger().d("请求后台数据login回复数据=$response");
await _storage.write('loginInfo', jsonEncode(response));
try {
Logger().d('响应数据: ${response.toString()}');
if (response['token'].toString() != '') {
final user = User.fromJson(response);
Logger().d('用户初始化成功: ${response['token'].toString()}');
await _storage.write("logintoken", response['token'].toString());
await _storage.write('user_info', user.toJson());
// 获取app的配置信息
await getAppConfig();
Get.offAllNamed(Routes.pairing);
} else {
throw Exception('接口返回错误: ${response['msg']}');
}
} catch (e, stack) {
Logger().d('用户数据处理失败: $e');
Logger().d('堆栈跟踪: $stack');
Get.snackbar(
'error'.tr,
'userDataParseFailed'.tr, // 用户数据解析失败
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.red.withOpacity(0.1),
colorText: Colors.red,
);
}
} catch (e, stack) {
// 新增:打印堆栈跟踪
Logger().d('用户数据处理失败: $e');
Logger().d('堆栈跟踪: $stack');
Get.snackbar('错误', '用户数据解析失败,请检查网络');
} else {
// API返回null的情况
Get.snackbar(
'error'.tr,
'networkError'.tr, // 网络错误,请重试
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.red.withOpacity(0.1),
colorText: Colors.red,
);
}
// Get.offAll(() => IndexWidget());
} catch (e) {
// 网络请求异常
Logger().e('登录请求失败: $e');
Get.snackbar(
'error'.tr,
'loginFailed'.tr, // 登录失败
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.red.withOpacity(0.1),
colorText: Colors.red,
);
} finally {
// 确保无论成功还是失败都重置加载状态
_isLoading.value = false;
}
}

17
lib/modules/login/views/login_view.dart

@ -13,12 +13,17 @@ class LoginView extends GetView<LoginController> {
Widget build(BuildContext context) {
final isDarkMode = Theme.of(context).brightness == Brightness.dark;
return Scaffold(
backgroundColor: isDarkMode ? Colors.black : Colors.grey[50],
body: SafeArea(
child: Obx(() => controller.viewState == LoginViewState.welcome
? _buildWelcomeView(isDarkMode)
: _buildVerificationView(context, isDarkMode)),
return GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: Scaffold(
backgroundColor: isDarkMode ? Colors.black : Colors.grey[50],
body: SafeArea(
child: Obx(() => controller.viewState == LoginViewState.welcome
? _buildWelcomeView(isDarkMode)
: _buildVerificationView(context, isDarkMode)),
),
),
);
}

Loading…
Cancel
Save