cacheMetaDataByClassId method
Future<void>
cacheMetaDataByClassId(
- String classId,
- String token,
- CacheMetadataListener listener, {
- bool force = false,
- PlayBackEnvEnum env = PlayBackEnvEnum.production,
拉取回放元数据并以 classId.json 保存到本地
Implementation
Future<void> cacheMetaDataByClassId(String classId, String token, CacheMetadataListener listener, {
bool force = false,
PlayBackEnvEnum env = PlayBackEnvEnum.production,
}) async {
cacheMetadataListeners[classId] = listener;
cacheMetadataListeners[classId]?.onCacheStarted(classId);
// 判断是否正在缓存中,如果缓存中,则返回
final status = await getCachedMetaDataStatus(classId);
if (status == CacheStatusEnum.caching && !force) {
cacheMetadataListeners[classId]?.onError(classId, 1000, '正在缓存中,请勿重复缓存');
return;
}
if (status == CacheStatusEnum.cachedSuccess && !force) {
cacheMetadataListeners[classId]?.onCacheSuccess(classId);
return;
}
final baseUrl = env == PlayBackEnvEnum.production ? TCICConst.playBackApiBaseUrl : TCICConst.playBackApiBaseUrlTest;
// JWT 中含 + / = 等字符,必须编码后放入 query,否则会被解析错误导致服务端收到错误 token 返回 401
final url = '$baseUrl$classId?token=${Uri.encodeComponent(token)}';
try {
final response = await _dio.get(url);
final data = response.data;
if (data['error_code'] != 0) {
cacheMetadataListeners[classId]?.onCacheFailed(classId, data['error_code'], data['error_message']);
return;
}
final cacheDir = await _ensureCacheDir();
final file = File(p.join(cacheDir.path, '${_safeId(classId)}.json'));
await file.writeAsString(jsonEncode({
'document_pages': List<Map<String, dynamic>>.from(data['data']['document_pages']),
'im_messages': List<Map<String, dynamic>>.from(data['data']['im_messages']),
'video_url': data['data']['video_url'] ?? '',
'whiteboard_url': data['data']['whiteboard_url'] ?? '',
'class_name': data['data']['class_name'] ?? '',
}));
_downloadingClassIds.add(classId);
downloadMetaData(classId, token);
} on DioException catch (e) {
// 401 等 HTTP 错误在此捕获,通过 listener 通知 Native 展示具体原因,避免异常抛到 MethodChannel
final code = e.response?.statusCode ?? -1;
final String message = _dioErrorMessage(e);
cacheMetadataListeners[classId]?.onError(classId, code, message);
} catch (e) {
cacheMetadataListeners[classId]?.onError(classId, -1, e.toString());
}
}