diff --git a/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart b/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart index 5ff02824..1ecfcae1 100644 --- a/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart +++ b/frontend/mobile-app/lib/features/contract_signing/presentation/pages/contract_signing_page.dart @@ -81,37 +81,55 @@ class _ContractSigningPageState extends ConsumerState { super.dispose(); } - /// 加载签署任务 + /// 加载签署任务(带重试机制,解决竞态问题) Future _loadTask() async { setState(() { _isLoading = true; _errorMessage = null; }); - try { - final service = ref.read(contractSigningServiceProvider); - final task = await service.getTask(widget.orderNo); + const maxRetries = 5; + const retryDelay = Duration(milliseconds: 500); - setState(() { - _task = task; - _isLoading = false; - _remainingSeconds = task.remainingSeconds; - _hasScrolledToBottom = task.scrolledToBottomAt != null; - _hasAcknowledged = task.acknowledgedAt != null; - }); + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + final service = ref.read(contractSigningServiceProvider); + final task = await service.getTask(widget.orderNo); - // 启动倒计时 - _startCountdown(); + setState(() { + _task = task; + _isLoading = false; + _remainingSeconds = task.remainingSeconds; + _hasScrolledToBottom = task.scrolledToBottomAt != null; + _hasAcknowledged = task.acknowledgedAt != null; + }); - // 加载 PDF - if (task.status != ContractSigningStatus.signed) { - _loadPdf(); + // 启动倒计时 + _startCountdown(); + + // 加载 PDF + if (task.status != ContractSigningStatus.signed) { + _loadPdf(); + } + return; // 成功,退出重试循环 + } catch (e) { + debugPrint('[ContractSigningPage] 加载任务失败 (尝试 $attempt/$maxRetries): $e'); + + // 如果是"任务不存在"错误且不是最后一次尝试,则等待后重试 + // 这是为了处理任务创建的竞态问题 + if (attempt < maxRetries && e.toString().contains('不存在')) { + debugPrint('[ContractSigningPage] 等待 ${retryDelay.inMilliseconds}ms 后重试...'); + await Future.delayed(retryDelay * attempt); // 指数退避 + continue; + } + + // 最后一次尝试或其他错误 + setState(() { + _isLoading = false; + _errorMessage = '加载签署任务失败: $e'; + }); + return; } - } catch (e) { - setState(() { - _isLoading = false; - _errorMessage = '加载签署任务失败: $e'; - }); } }