Browse Source

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

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

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

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

Loading…
Cancel
Save