resumeDownloadCache method
Future<bool>
resumeDownloadCache(
- String classId,
- String token, [
- CacheMetadataListener? listener
在未完成离线包(存在 {classId}.json 且尚未生成 success)的前提下继续下载。
token 与拉取元数据时一致(当前下载链路未校验 token,保留参数便于与 Native 对齐)。
返回 true 表示已启动续传任务。
listener 可选:若传入则更新本 classId 的监听器,适用于新 session 中直接调用
resume 而未调用过 cacheMetaDataByClassId 的场景(否则回调到旧 listener 无法更新当前 UI)。
Implementation
Future<bool> resumeDownloadCache(
String classId,
String token, [
CacheMetadataListener? listener,
]) async {
classId = _trimClassId(classId);
if (classId.isEmpty) return false;
if (_downloadMetaDataRunning.contains(classId)) return false;
// 在任何 await 之前同步注册 listener 并立刻恢复缓存进度,使 UI 零延迟显示暂停时的进度。
if (listener != null) {
cacheMetadataListeners[classId] = listener;
_restoreCachedProgress(classId);
}
final cacheDir = await _ensureCacheDir();
final safeId = _safeId(classId);
final metaFile = File(p.join(cacheDir.path, '$safeId.json'));
final successFile = File(p.join(cacheDir.path, '$safeId-success.json'));
if (!await metaFile.exists()) return false;
if (await successFile.exists()) return false;
_pauseRequestedForClassId.remove(classId);
_pausedClassIds.remove(classId);
_downloadingClassIds.add(classId);
downloadMetaData(classId, token);
return true;
}