Browse Source

fix(splash): 优化版本更新弹窗弹出机制,避免卡住进程

优化启动任务执行顺序,避免权限请求与版本弹窗竞争
移除冗余代码并改进版本更新弹窗的错误处理
weicu
lxm 12 months ago
parent
commit
bdf2e58d60
  1. 47
      lib/modules/splash/controllers/splash_controller.dart
  2. 13
      lib/modules/splash/views/splash_view.dart

47
lib/modules/splash/controllers/splash_controller.dart

@ -68,16 +68,15 @@ class SplashController extends GetxController {
} }
/// 切换隐私政策同意状态 - 新增方法 /// 切换隐私政策同意状态 - 新增方法
void togglePrivacyAcceptance() { // void togglePrivacyAcceptance() {
_hasAcceptedPrivacy.value = !_hasAcceptedPrivacy.value; // _hasAcceptedPrivacy.value = !_hasAcceptedPrivacy.value;
_storage.write('hasAcceptedPrivacy', _hasAcceptedPrivacy.value); // _storage.write('hasAcceptedPrivacy', _hasAcceptedPrivacy.value);
} // }
/// 检查隐私政策,如果未同意,则显示弹窗并等待用户操作 /// 检查隐私政策,如果未同意,则显示弹窗并等待用户操作
/// 返回用户是否同意 /// 返回用户是否同意
Future<bool> _checkAndRequestPrivacy() async { Future<bool> _checkAndRequestPrivacy() async {
if (_storage.read<bool>('hasAcceptedPrivacy') ?? false) { if (_hasAcceptedPrivacy.value) {
_hasAcceptedPrivacy.value = true;
return true; return true;
} }
@ -101,7 +100,6 @@ class SplashController extends GetxController {
return completer.future; return completer.future;
} }
/// 网络连接检查
/// 网络连接检查 - 阻塞版本 /// 网络连接检查 - 阻塞版本
Future<void> _checkNetworkStatus() async { Future<void> _checkNetworkStatus() async {
while (true) { while (true) {
@ -196,11 +194,15 @@ class SplashController extends GetxController {
//步骤2:检查网络连接状态 //步骤2:检查网络连接状态
await _checkNetworkStatus(); await _checkNetworkStatus();
// 同样使用 Future.wait,确保此函数在所有子任务完成后才结束 // 同样使用 Future.wait,确保此函数在所有子任务完成后才结束
await Future.wait([ // 先请求系统权限,避免与版本弹窗竞争
_requestTrackingPermissionAsync(), await _requestTrackingPermissionAsync();
_validateTokenAsync(), await _performVersionCheckAsync();
_performVersionCheckAsync(), await _validateTokenAsync();
]); //await Future.wait([
//_requestTrackingPermissionAsync(),
//_validateTokenAsync(),
//_performVersionCheckAsync(),
//]);
Logger.d(_tag, '所有后台任务已完成'); Logger.d(_tag, '所有后台任务已完成');
} }
@ -242,22 +244,18 @@ class SplashController extends GetxController {
if (updateInfo.hasUpdate) { if (updateInfo.hasUpdate) {
Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}'); Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}');
final completer = Completer<void>(); // 等待到下一微任务,降低与其它 UI 的并发竞争
// 在主线程中显示更新对话框 await Future.delayed(Duration.zero);
WidgetsBinding.instance.addPostFrameCallback((_) { try {
// 使用 whenComplete 确保无论弹窗如何关闭,Future 都会完成 await VersionUpdateDialog.show(updateInfo);
VersionUpdateDialog.show(updateInfo).whenComplete(() { } catch (e) {
if (!completer.isCompleted) completer.complete(); Logger.e(_tag, '更新弹窗显示失败: $e');
}); }
});
// 等待弹窗交互结束
await completer.future;
} else { } else {
Logger.i(_tag, '当前已是最新版本'); Logger.i(_tag, '当前已是最新版本');
} }
} catch (e) { } catch (e) {
Logger.e(_tag, '版本检查失败: $e'); Logger.e(_tag, '版本检查失败: $e');
// 即使检查失败,也视为任务完成
} }
} }
@ -278,8 +276,11 @@ class SplashController extends GetxController {
Future<bool> getLoginToken() async { Future<bool> getLoginToken() async {
try { try {
final appVersion = versionService.cachedAppVersion; final appVersion = versionService.cachedAppVersion;
final channel = versionService.cachedChannel;
Logger.i(_tag, 'Token登录请求: version=$appVersion, channel=$channel');
final response = await Api.tokenlogin({ final response = await Api.tokenlogin({
'version': appVersion, 'version': appVersion,
'channel': channel,
}); });
if (response?['user'] != null && response['user'] != '') { if (response?['user'] != null && response['user'] != '') {
final user = User.fromJson(response); final user = User.fromJson(response);

13
lib/modules/splash/views/splash_view.dart

@ -41,12 +41,13 @@ class SplashView extends GetView<SplashController> {
), ),
// 隐私政策组件 - 添加在底部 // 隐私政策组件 - 添加在底部
Positioned( if (!controller.hasAcceptedPrivacy.value)
bottom: 90.h, Positioned(
left: 0, bottom: 90.h,
right: 0, left: 0,
child: _buildTermsAndPrivacy(isDarkMode), right: 0,
), child: _buildTermsAndPrivacy(isDarkMode),
),
// 版本号 // 版本号
//_buildVersionInfo(isDarkMode), //_buildVersionInfo(isDarkMode),

Loading…
Cancel
Save