From 9d8333fe325eea269138c62dc8a4c3dcf3cb7f12 Mon Sep 17 00:00:00 2001 From: FC383 <1030945211@qq.com> Date: Sat, 9 May 2026 06:43:45 +0800 Subject: [PATCH 1/5] Update eh_download_model.dart --- lib/network/eh_network/eh_download_model.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/network/eh_network/eh_download_model.dart b/lib/network/eh_network/eh_download_model.dart index 3fa0d367e..b257aef77 100644 --- a/lib/network/eh_network/eh_download_model.dart +++ b/lib/network/eh_network/eh_download_model.dart @@ -343,9 +343,17 @@ class _IsolateDownloader{ } ZipFile.openAndExtract("$savePath/temp.zip", savePath); var files = Directory(savePath).listSync(); - files.sort((a, b) => a.path.compareTo(b.path)); + files.sort((a, b) { + int extractNumber(FileSystemEntity entity) { + var name = entity.path.split(pathSep).last; + var matches = RegExp(r'\d+').allMatches(name).toList(); + if (matches.isEmpty) return 0; + return int.parse(matches.last.group(0)!); + } + return extractNumber(a).compareTo(extractNumber(b)); + }); int index = 0; - for(var entry in Directory(savePath).listSync()){ + for(var entry in files){ if(entry is File){ var name = entry.path.split(pathSep).last; if(name.endsWith(".zip")){ @@ -381,4 +389,4 @@ class _DownloadException{ final String message; const _DownloadException(this.message); -} \ No newline at end of file +} From f9c77408f956dbf3f3d09e1232571863902d5b7f Mon Sep 17 00:00:00 2001 From: FC383 <229264094+FC383@users.noreply.github.com> Date: Wed, 8 Jul 2026 19:23:17 +0800 Subject: [PATCH 2/5] Update downloading_page.dart --- lib/pages/downloading_page.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/pages/downloading_page.dart b/lib/pages/downloading_page.dart index f3fa01c36..24b05e940 100644 --- a/lib/pages/downloading_page.dart +++ b/lib/pages/downloading_page.dart @@ -195,11 +195,12 @@ class _DownloadingTileState extends State<_DownloadingTile> { } } - void updateStatistic() { - if(comic != DownloadManager().downloading.first) { +void updateStatistic() { + final firstItem = DownloadManager().downloading.firstOrNull; + if (firstItem == null || comic != firstItem) { return; } - comic = DownloadManager().downloading.first; + comic = firstItem; speed = comic.currentSpeed; downloadPages = comic.downloadedPages; pagesCount = comic.totalPages; @@ -209,7 +210,8 @@ class _DownloadingTileState extends State<_DownloadingTile> { if (pagesCount != null && pagesCount! > 0) { value = downloadPages / pagesCount!; } - } +} + void updateUi() { setState(() { From 0119ce78f4155a5851b80f106b2a99024b481246 Mon Sep 17 00:00:00 2001 From: FC383 <229264094+FC383@users.noreply.github.com> Date: Wed, 8 Jul 2026 19:24:50 +0800 Subject: [PATCH 3/5] Update eh_download_model.dart --- lib/network/eh_network/eh_download_model.dart | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/network/eh_network/eh_download_model.dart b/lib/network/eh_network/eh_download_model.dart index b257aef77..3812e254e 100644 --- a/lib/network/eh_network/eh_download_model.dart +++ b/lib/network/eh_network/eh_download_model.dart @@ -192,20 +192,22 @@ class EhDownloadingItem extends DownloadingItem{ _downloadLink = res.data; } _downloader = _IsolateDownloader( - _downloadLink!, - path, - (current, total, speed){ - _currentBytes = current; - _totalBytes = total; - _currentSpeed = speed; - updateInfo?.call(); - if(current == total){ - if (DownloadManager().downloading.firstOrNull != this) return; - finish(); - } - }, - onError! - ); + _downloadLink!, + path, + (current, total, speed){ + _currentBytes = current; + _totalBytes = total; + _currentSpeed = speed; + if(current == total){ + if (DownloadManager().downloading.firstOrNull != this) return; + finish(); // _onFinish 中已含 _saveInfo → 通知 + } else { + updateInfo?.call(); // 只在未完成时通知进度 + } + }, + onError! +); + _downloader!.start(); } catch(e, s){ From 9761bc07c309ec3c9cf4d493def67c166b49665f Mon Sep 17 00:00:00 2001 From: FC383 <229264094+FC383@users.noreply.github.com> Date: Wed, 8 Jul 2026 19:25:22 +0800 Subject: [PATCH 4/5] Update eh_download_model.dart --- lib/network/eh_network/eh_download_model.dart | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/network/eh_network/eh_download_model.dart b/lib/network/eh_network/eh_download_model.dart index 3812e254e..144241fed 100644 --- a/lib/network/eh_network/eh_download_model.dart +++ b/lib/network/eh_network/eh_download_model.dart @@ -218,9 +218,15 @@ class EhDownloadingItem extends DownloadingItem{ } } - void finish() async{ - onFinish?.call(); - } +void finish() async{ + try { + onFinish?.call(); + } catch (e, s) { + LogManager.addLog(LogLevel.error, "Download", "Finish error: $e\n$s"); + onError?.call(); + } +} + @override pause() async{ From b35975882f23cc668d2640af3786b1606105a89c Mon Sep 17 00:00:00 2001 From: FC383 <229264094+FC383@users.noreply.github.com> Date: Wed, 8 Jul 2026 19:27:39 +0800 Subject: [PATCH 5/5] Update eh_download_model.dart --- lib/network/eh_network/eh_download_model.dart | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/lib/network/eh_network/eh_download_model.dart b/lib/network/eh_network/eh_download_model.dart index 144241fed..562ec0903 100644 --- a/lib/network/eh_network/eh_download_model.dart +++ b/lib/network/eh_network/eh_download_model.dart @@ -350,30 +350,47 @@ class _IsolateDownloader{ sendPort.send(status); } ZipFile.openAndExtract("$savePath/temp.zip", savePath); - var files = Directory(savePath).listSync(); - files.sort((a, b) { - int extractNumber(FileSystemEntity entity) { - var name = entity.path.split(pathSep).last; - var matches = RegExp(r'\d+').allMatches(name).toList(); - if (matches.isEmpty) return 0; - return int.parse(matches.last.group(0)!); - } - return extractNumber(a).compareTo(extractNumber(b)); - }); - int index = 0; - for(var entry in files){ - if(entry is File){ - var name = entry.path.split(pathSep).last; - if(name.endsWith(".zip")){ - entry.deleteSync(); - } else if(!name.contains("cover")){ - var baseName = index.toString(); - index++; - var ext = name.split(".").last; - entry.renameSync("$savePath/$baseName.$ext"); + var files = Directory(savePath) + .listSync() + .whereType() + .where((f) => !f.path.endsWith(".zip") && !f.path.contains("cover")) + .toList(); + + // 自然排序:按文件名中交替出现的文本段和数字段依次比较 + int naturalCompare(String a, String b) { + final regex = RegExp(r'(\D+)|(\d+)'); + final aParts = regex.allMatches(a).map((m) => m.group(0)!).toList(); + final bParts = regex.allMatches(b).map((m) => m.group(0)!).toList(); + + for (int i = 0; i < aParts.length && i < bParts.length; i++) { + final numA = int.tryParse(aParts[i]); + final numB = int.tryParse(bParts[i]); + + if (numA != null && numB != null) { + final cmp = numA.compareTo(numB); + if (cmp != 0) return cmp; + } else { + final cmp = aParts[i].compareTo(bParts[i]); + if (cmp != 0) return cmp; } } + return aParts.length.compareTo(bParts.length); + } + + files.sort((a, b) { + final nameA = a.path.split(pathSep).last; + final nameB = b.path.split(pathSep).last; + return naturalCompare(nameA, nameB); + }); + + for (int index = 0; index < files.length; index++) { + final entry = files[index]; + final ext = entry.path.split(".").last; + entry.renameSync("$savePath/$index.$ext"); } + + // 删除 zip 文件 + File("$savePath/temp.zip").deleteSync(); sendPort.send("finish"); } catch(e, s){