|
|
|
@ -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); |
|
|
|
|