Files
app/lib/data/models/download_task_model.dart
T
2026-05-15 09:03:09 +08:00

155 lines
4.8 KiB
Dart

import '../../core/utils/app_logger.dart';
/// 下载状态
enum DownloadStatus {
waiting, // 等待中
downloading, // 下载中
completed, // 已完成
paused, // 已暂停
failed, // 失败
cancelled, // 已取消
}
/// 下载任务模型
class DownloadTaskModel {
final String id;
final String fileName;
final String fileUri; // cloudreve URI
final String? downloadUrl; // 实际下载URL
final int fileSize;
final String savePath;
String? backgroundTaskId; // background_downloader 的 task ID(可变,用于重启后恢复映射)
DownloadStatus status;
int downloadedBytes;
int speed; // 下载速度,字节/秒
bool waitingForWifi; // 是否在等待WiFi(非持久化)
final DateTime createdAt;
DateTime? completedAt;
String? errorMessage;
double get progress => fileSize > 0 ? downloadedBytes / fileSize : 0.0;
int get remainingBytes => fileSize - downloadedBytes;
String get speedText {
if (speed <= 0) return '';
if (speed < 1024) return '$speed B/s';
if (speed < 1024 * 1024) return '${(speed / 1024).toStringAsFixed(1)} KB/s';
return '${(speed / (1024 * 1024)).toStringAsFixed(1)} MB/s';
}
String get progressText {
if (status == DownloadStatus.completed) {
return '100%';
}
AppLogger.d('DownloadTaskModel -> 已经初始化, status: $status');
final percent = (progress * 100).toStringAsFixed(1);
AppLogger.d('DownloadTaskModel -> 已经初始化, percent: $percent');
return '$percent%';
}
String get statusText {
switch (status) {
case DownloadStatus.waiting:
return waitingForWifi ? '等待WiFi' : '等待中';
case DownloadStatus.downloading:
return '下载中';
case DownloadStatus.completed:
return '已完成';
case DownloadStatus.paused:
return '已暂停';
case DownloadStatus.failed:
return '下载失败';
case DownloadStatus.cancelled:
return '已取消';
}
}
DownloadTaskModel({
required this.id,
required this.fileName,
required this.fileUri,
this.downloadUrl,
required this.fileSize,
required this.savePath,
this.backgroundTaskId,
this.status = DownloadStatus.waiting,
this.downloadedBytes = 0,
this.speed = 0,
this.waitingForWifi = false,
DateTime? createdAt,
this.completedAt,
this.errorMessage,
}) : createdAt = createdAt ?? DateTime.now();
DownloadTaskModel copyWith({
String? id,
String? fileName,
String? fileUri,
String? downloadUrl,
int? fileSize,
String? savePath,
String? backgroundTaskId,
DownloadStatus? status,
int? downloadedBytes,
int? speed,
bool? waitingForWifi,
DateTime? createdAt,
DateTime? completedAt,
String? errorMessage,
}) {
return DownloadTaskModel(
id: id ?? this.id,
fileName: fileName ?? this.fileName,
fileUri: fileUri ?? this.fileUri,
downloadUrl: downloadUrl ?? this.downloadUrl,
fileSize: fileSize ?? this.fileSize,
savePath: savePath ?? this.savePath,
backgroundTaskId: backgroundTaskId ?? this.backgroundTaskId,
status: status ?? this.status,
downloadedBytes: downloadedBytes ?? this.downloadedBytes,
speed: speed ?? this.speed,
waitingForWifi: waitingForWifi ?? this.waitingForWifi,
createdAt: createdAt ?? this.createdAt,
completedAt: completedAt ?? this.completedAt,
errorMessage: errorMessage ?? this.errorMessage,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'fileName': fileName,
'fileUri': fileUri,
'downloadUrl': downloadUrl,
'fileSize': fileSize,
'savePath': savePath,
'backgroundTaskId': backgroundTaskId,
'status': status.index,
'downloadedBytes': downloadedBytes,
'speed': speed,
'createdAt': createdAt.toIso8601String(),
'completedAt': completedAt?.toIso8601String(),
'errorMessage': errorMessage,
};
}
factory DownloadTaskModel.fromJson(Map<String, dynamic> json) {
return DownloadTaskModel(
id: json['id'] as String,
fileName: json['fileName'] as String,
fileUri: json['fileUri'] as String,
downloadUrl: json['downloadUrl'] as String?,
fileSize: json['fileSize'] as int,
savePath: json['savePath'] as String,
backgroundTaskId: json['backgroundTaskId'] as String?,
status: DownloadStatus.values[json['status'] as int? ?? 0],
downloadedBytes: json['downloadedBytes'] as int? ?? 0,
speed: json['speed'] as int? ?? 0,
createdAt: json['createdAt'] != null
? DateTime.parse(json['createdAt'] as String)
: null,
completedAt: json['completedAt'] != null
? DateTime.parse(json['completedAt'] as String)
: null,
errorMessage: json['errorMessage'] as String?,
);
}
}