diff --git a/frontend/mining-app/lib/core/updater/channels/self_hosted_updater.dart b/frontend/mining-app/lib/core/updater/channels/self_hosted_updater.dart index 74fcf5d7..366dcb2f 100644 --- a/frontend/mining-app/lib/core/updater/channels/self_hosted_updater.dart +++ b/frontend/mining-app/lib/core/updater/channels/self_hosted_updater.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import '../models/version_info.dart'; @@ -48,15 +49,13 @@ class _SelfHostedUpdaterState extends State { DownloadProgress _progress = DownloadProgress.initial(); File? _downloadedFile; bool _isDownloading = false; + StreamSubscription? _progressSubscription; @override void initState() { super.initState(); - _listenToProgress(); - } - - void _listenToProgress() { - UpdateService.instance.downloadProgressStream?.listen((progress) { + // 订阅持久化广播流,无论何时开始下载都能收到进度 + _progressSubscription = UpdateService.instance.downloadProgressStream.listen((progress) { if (mounted) { setState(() { _progress = progress; @@ -65,6 +64,12 @@ class _SelfHostedUpdaterState extends State { }); } + @override + void dispose() { + _progressSubscription?.cancel(); + super.dispose(); + } + Future _startDownload() async { setState(() { _isDownloading = true; @@ -73,8 +78,6 @@ class _SelfHostedUpdaterState extends State { ); }); - _listenToProgress(); - final file = await UpdateService.instance.downloadUpdate(widget.versionInfo); if (mounted) { diff --git a/frontend/mining-app/lib/core/updater/update_service.dart b/frontend/mining-app/lib/core/updater/update_service.dart index 26b0c4c1..91cd80c0 100644 --- a/frontend/mining-app/lib/core/updater/update_service.dart +++ b/frontend/mining-app/lib/core/updater/update_service.dart @@ -51,6 +51,10 @@ class UpdateService { final _updateAvailableController = StreamController.broadcast(); Stream get updateAvailableStream => _updateAvailableController.stream; + /// 持久化的下载进度流(跨 DownloadManager 实例保持订阅有效) + final _downloadProgressController = StreamController.broadcast(); + StreamSubscription? _downloadProgressSubscription; + VersionInfo? _latestVersion; VersionInfo? get latestVersion => _latestVersion; @@ -126,14 +130,20 @@ class UpdateService { /// 下载更新 Future downloadUpdate(VersionInfo versionInfo) async { + // 取消旧的进度转发订阅 + await _downloadProgressSubscription?.cancel(); _downloadManager?.dispose(); _downloadManager = DownloadManager(versionInfo: versionInfo); + // 将新 DownloadManager 的进度转发到持久化广播流 + _downloadProgressSubscription = _downloadManager!.progressStream.listen( + (progress) => _downloadProgressController.add(progress), + ); return await _downloadManager!.startDownload(); } - /// 获取下载进度流 - Stream? get downloadProgressStream => - _downloadManager?.progressStream; + /// 获取下载进度流(持久化广播流,订阅后可跨下载任务接收进度) + Stream get downloadProgressStream => + _downloadProgressController.stream; /// 取消下载 void cancelDownload() { @@ -166,7 +176,9 @@ class UpdateService { } void dispose() { + _downloadProgressSubscription?.cancel(); _downloadManager?.dispose(); + _downloadProgressController.close(); _updateAvailableController.close(); } }