|
|
|
@ -59,20 +59,37 @@ class SplashController extends GetxController { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
//弹出用户追踪问题 |
|
|
|
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((_) async { |
|
|
|
final status = |
|
|
|
await AppTrackingTransparency.requestTrackingAuthorization(); |
|
|
|
// 异步处理用户追踪授权,不阻塞主流程 |
|
|
|
_requestTrackingPermissionAsync(); |
|
|
|
} |
|
|
|
|
|
|
|
/// 异步请求追踪权限,不阻塞启动流程 |
|
|
|
void _requestTrackingPermissionAsync() { |
|
|
|
Future.delayed(const Duration(milliseconds: 500), () async { |
|
|
|
try { |
|
|
|
await AppTrackingTransparency.requestTrackingAuthorization(); |
|
|
|
Logger.d(_tag, '用户追踪权限请求完成'); |
|
|
|
} catch (e) { |
|
|
|
Logger.e(_tag, '用户追踪权限请求失败: $e'); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
void _startNormalFlow() { |
|
|
|
_startLoadingAnimation(); |
|
|
|
_loadAppResources(); |
|
|
|
} |
|
|
|
|
|
|
|
// 延迟执行版本检查,避免影响启动速度 |
|
|
|
Future.delayed(const Duration(seconds: 1), () { |
|
|
|
_checkVersionUpdateIfNeeded(); |
|
|
|
/// 智能调度版本检查,在页面跳转后执行,完全不影响启动流程 |
|
|
|
void _scheduleVersionCheck() { |
|
|
|
// 在独立的微任务中执行,避免阻塞主线程 |
|
|
|
scheduleMicrotask(() async { |
|
|
|
try { |
|
|
|
Logger.d(_tag, '开始执行版本检查(后台任务)'); |
|
|
|
_checkVersionUpdateIfNeeded(); |
|
|
|
} catch (e) { |
|
|
|
Logger.e(_tag, '版本检查调度失败: $e'); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
@ -98,18 +115,6 @@ class SplashController extends GetxController { |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
// 初始化地图SDK |
|
|
|
// void _initMapSDK() { |
|
|
|
// try { |
|
|
|
// AmapFlutter().initSdk( |
|
|
|
// iosKey: "a4a1394fe817c2f86a424b897b4a9af4", |
|
|
|
// androidKey: "78e7946dd602778df82c6ae143a88184", |
|
|
|
// ); |
|
|
|
// } catch (e) { |
|
|
|
// print('地图SDK初始化失败: $e'); |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
// 进度条动画(持续2秒) |
|
|
|
void _startLoadingAnimation() { |
|
|
|
const totalDuration = 1500; // 动画总时长增加到1.5秒 |
|
|
|
@ -136,22 +141,23 @@ class SplashController extends GetxController { |
|
|
|
// await _loadImages(); |
|
|
|
// await _initDatabase(); |
|
|
|
|
|
|
|
// 检查版本更新(在后台进行,不阻塞启动流程) |
|
|
|
//_checkVersionUpdate(); |
|
|
|
|
|
|
|
_isResourceLoaded.value = true; |
|
|
|
_checkNavigateCondition(); |
|
|
|
} catch (e) { |
|
|
|
Get.snackbar('错误', '资源加载失败,请检查网络连接'); |
|
|
|
_isResourceLoaded.value = true; // 允许用户继续使用 |
|
|
|
print('资源加载错误: $e'); |
|
|
|
Logger.e(_tag, '资源加载错误: $e'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 检查跳转条件 |
|
|
|
void _checkNavigateCondition() { |
|
|
|
void _checkNavigateCondition() async { |
|
|
|
if (_loadingProgress.value >= 1.0 && _isResourceLoaded.value) { |
|
|
|
_navigateToLogin(); |
|
|
|
// 关键改动:先执行页面跳转,并用 await 等待它完成 |
|
|
|
await _navigateToLogin(); |
|
|
|
|
|
|
|
// 页面跳转完全结束后,再安心地安排版本检查 |
|
|
|
_scheduleVersionCheck(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -159,7 +165,7 @@ class SplashController extends GetxController { |
|
|
|
Future<void> _navigateToLogin() async { |
|
|
|
bool isLoggedIn = false; |
|
|
|
final token = _storage.read('logintoken'); |
|
|
|
print('getLoginToken:进来了${token}'); |
|
|
|
Logger.d(_tag, 'getLoginToken:进来了${token}'); |
|
|
|
if (token != null && token.isNotEmpty) { |
|
|
|
isLoggedIn = await getLoginToken(); |
|
|
|
} |
|
|
|
@ -173,14 +179,14 @@ class SplashController extends GetxController { |
|
|
|
|
|
|
|
Future<bool> getLoginToken() async { |
|
|
|
try { |
|
|
|
print('getLoginToken:进来了'); |
|
|
|
Logger.d(_tag, 'getLoginToken:进来了'); |
|
|
|
//if (User.getname() != "") { |
|
|
|
final response = await Api.tokenlogin(); |
|
|
|
print('getLoginToken: $response'); |
|
|
|
Logger.d(_tag, 'getLoginToken: $response'); |
|
|
|
if (response == null) return false; |
|
|
|
|
|
|
|
if (response['user'] != '') { |
|
|
|
print('getLoginToken:进来了'); |
|
|
|
Logger.d(_tag, 'getLoginToken:进来了'); |
|
|
|
// 根据API设计调整 |
|
|
|
final user = User.fromJson(response); |
|
|
|
|
|
|
|
@ -192,21 +198,21 @@ class SplashController extends GetxController { |
|
|
|
//} |
|
|
|
return false; |
|
|
|
} catch (e) { |
|
|
|
print('Token获取失败: $e'); |
|
|
|
Logger.e(_tag, 'Token获取失败: $e'); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Future<bool> getAppConfig() async { |
|
|
|
try { |
|
|
|
print('getAppConfig:进来了'); |
|
|
|
Logger.d(_tag, 'getAppConfig:进来了'); |
|
|
|
//if (User.getname() != "") { |
|
|
|
final response = await Api.getappconfig(); |
|
|
|
print('getAppConfig: $response'); |
|
|
|
Logger.d(_tag, 'getAppConfig: $response'); |
|
|
|
if (response == null) return false; |
|
|
|
// 根据API设计调整 |
|
|
|
final resp = UserGetAppConfigResp.fromJson(response); |
|
|
|
print('getAppConfig:进来了'); |
|
|
|
Logger.d(_tag, 'getAppConfig:进来了'); |
|
|
|
// 存储用户信息(示例) |
|
|
|
// _storage.write('ENV', resp.env); |
|
|
|
// _storage.write('AGENTS', resp.agents); |
|
|
|
@ -214,7 +220,7 @@ class SplashController extends GetxController { |
|
|
|
AppConfig.initialize(resp); |
|
|
|
return true; |
|
|
|
} catch (e) { |
|
|
|
print('getAppConfig 取失败: $e'); |
|
|
|
Logger.e(_tag, 'getAppConfig 取失败: $e'); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -236,7 +242,8 @@ class SplashController extends GetxController { |
|
|
|
} |
|
|
|
// 条件2:距离上次检查超过24小时 |
|
|
|
else if (lastCheckTimestamp != null) { |
|
|
|
final lastCheckTime = DateTime.fromMillisecondsSinceEpoch(lastCheckTimestamp); |
|
|
|
final lastCheckTime = |
|
|
|
DateTime.fromMillisecondsSinceEpoch(lastCheckTimestamp); |
|
|
|
final timeDifference = now.difference(lastCheckTime); |
|
|
|
|
|
|
|
if (timeDifference.inHours >= _versionCheckIntervalHours) { |
|
|
|
@ -265,18 +272,25 @@ class SplashController extends GetxController { |
|
|
|
Future<void> _performVersionCheck() async { |
|
|
|
try { |
|
|
|
final versionService = VersionUpdateService.to; |
|
|
|
final updateInfo = await versionService.checkForUpdate(); |
|
|
|
|
|
|
|
if (updateInfo.hasUpdate) { |
|
|
|
Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}'); |
|
|
|
// 显示更新对话框 |
|
|
|
await VersionUpdateDialog.show(updateInfo); |
|
|
|
} else { |
|
|
|
Logger.i(_tag, '当前已是最新版本: ${updateInfo.currentVersion}'); |
|
|
|
} |
|
|
|
// 异步执行,不等待结果 |
|
|
|
versionService.checkForUpdate().then((updateInfo) { |
|
|
|
if (updateInfo.hasUpdate) { |
|
|
|
Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}'); |
|
|
|
// 在主线程中显示更新对话框 |
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) { |
|
|
|
VersionUpdateDialog.show(updateInfo); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
Logger.i(_tag, '当前已是最新版本: ${updateInfo.currentVersion}'); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新检查记录 |
|
|
|
_updateVersionCheckRecord(); |
|
|
|
// 更新检查记录 |
|
|
|
_updateVersionCheckRecord(); |
|
|
|
}).catchError((e) { |
|
|
|
Logger.e(_tag, '版本检查失败: $e'); |
|
|
|
// 即使检查失败,也更新记录,避免频繁重试 |
|
|
|
_updateVersionCheckRecord(); |
|
|
|
}); |
|
|
|
} catch (e) { |
|
|
|
Logger.e(_tag, '版本检查失败: $e'); |
|
|
|
// 即使检查失败,也更新记录,避免频繁重试 |
|
|
|
|