resumeDownloadCache method

Future<bool> resumeDownloadCache(
  1. String classId,
  2. String token, [
  3. 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;
}