鸿蒙flutter第三方库适配 - 文件压缩工具
运行效果图文件压缩工具是一款专业的文件压缩与解压管理应用,支持多种主流压缩格式,帮助用户高效管理文件存储空间。应用提供直观的文件选择界面、灵活的压缩设置选项、实时的任务进度显示,让文件压缩变得简单高效。应用以深邃的紫色为主色调,象征专业与高效。涵盖文件压缩、任务管理、设置管理三大模块。用户可以选择文件、设置压缩参数、查看压缩进度,实现一键压缩解压操作。序号格式名称扩展名描述特点1ZIP.zip通用
文件压缩工具
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
适配的第三方库地址:
- shared_preferences: https://pub.dev/packages/shared_preferences
一、项目概述
运行效果图





1.1 应用简介
文件压缩工具是一款专业的文件压缩与解压管理应用,支持多种主流压缩格式,帮助用户高效管理文件存储空间。应用提供直观的文件选择界面、灵活的压缩设置选项、实时的任务进度显示,让文件压缩变得简单高效。
应用以深邃的紫色为主色调,象征专业与高效。涵盖文件压缩、任务管理、设置管理三大模块。用户可以选择文件、设置压缩参数、查看压缩进度,实现一键压缩解压操作。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 文件选择 | 多文件批量选择 | Checkbox列表 |
| 压缩格式 | 五种主流格式支持 | 枚举定义 |
| 压缩级别 | 四级压缩级别 | Radio选择 |
| 批量处理 | 多任务并行处理 | 任务队列 |
| 进度显示 | 实时压缩进度 | 进度条组件 |
| 压缩统计 | 压缩率计算 | 数据分析 |
| 密码保护 | 压缩包加密 | 密码设置 |
| 设置持久化 | 保存用户配置 | SharedPreferences |
1.3 压缩格式定义
| 序号 | 格式名称 | 扩展名 | 描述 | 特点 |
|---|---|---|---|---|
| 1 | ZIP | .zip | 通用压缩格式 | 兼容性最好 |
| 2 | RAR | .rar | 高压缩率格式 | 压缩率高 |
| 3 | 7Z | .7z | 高压缩比格式 | 开源免费 |
| 4 | TAR | .tar | 归档格式 | 仅打包 |
| 5 | GZ | .gz | Gzip压缩 | 单文件压缩 |
1.4 压缩级别定义
| 序号 | 级别名称 | 级别值 | 描述 | 适用场景 |
|---|---|---|---|---|
| 1 | 无压缩 | 0 | 仅打包不压缩 | 快速打包 |
| 2 | 快速 | 1 | 压缩速度快 | 临时文件 |
| 3 | 标准 | 5 | 平衡速度与压缩率 | 日常使用 |
| 4 | 最大 | 9 | 压缩率最高 | 长期存储 |
1.5 任务状态定义
| 序号 | 状态名称 | Emoji | 描述 |
|---|---|---|---|
| 1 | 等待中 | ⏳ | 任务在队列中等待 |
| 2 | 压缩中 | 🔄 | 正在进行压缩 |
| 3 | 已完成 | ✅ | 压缩成功完成 |
| 4 | 失败 | ❌ | 压缩过程出错 |
1.6 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 数据存储 | SharedPreferences | >= 2.0.0 |
| 状态管理 | StatefulWidget | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.7 项目结构
lib/
└── main_file_compression.dart
├── FileCompressionApp # 应用入口
├── CompressionFormat # 压缩格式枚举
├── CompressionLevel # 压缩级别枚举
├── CompressionSettings # 压缩设置模型
├── CompressionTask # 压缩任务模型
├── CompressionTaskStatus # 任务状态枚举
├── MockFile # 模拟文件模型
├── CompressionStorage # 设置存储服务
├── HomePage # 主页面(底部导航)
├── _buildCompressPage # 压缩页面
├── _buildTasksPage # 任务页面
└── _buildSettingsPage # 设置页面
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 压缩流程
三、核心模块设计
3.1 数据模型设计
3.1.1 压缩格式枚举 (CompressionFormat)
enum CompressionFormat {
zip('ZIP', '.zip', Icons.folder_zip, '通用压缩格式'),
rar('RAR', '.rar', Icons.archive, '高压缩率格式'),
sevenZ('7Z', '.7z', Icons.compress, '高压缩比格式'),
tar('TAR', '.tar', Icons.inventory_2, '归档格式'),
gz('GZ', '.gz', Icons.file_present, 'Gzip压缩');
final String label;
final String extension;
final IconData icon;
final String description;
const CompressionFormat(this.label, this.extension, this.icon, this.description);
}
3.1.2 压缩级别枚举 (CompressionLevel)
enum CompressionLevel {
none('无压缩', 0, Icons.remove_circle_outline, '仅打包不压缩'),
fast('快速', 1, Icons.speed, '压缩速度快,压缩率低'),
normal('标准', 5, Icons.balance, '平衡速度与压缩率'),
maximum('最大', 9, Icons.compress, '压缩率最高,速度慢');
final String label;
final int level;
final IconData icon;
final String description;
const CompressionLevel(this.label, this.level, this.icon, this.description);
}
3.1.3 压缩设置模型 (CompressionSettings)
class CompressionSettings {
final CompressionFormat format;
final CompressionLevel level;
final bool includeSubfolders;
final bool preserveStructure;
final String password;
final bool encryptNames;
const CompressionSettings({
this.format = CompressionFormat.zip,
this.level = CompressionLevel.normal,
this.includeSubfolders = true,
this.preserveStructure = true,
this.password = '',
this.encryptNames = false,
});
CompressionSettings copyWith({
CompressionFormat? format,
CompressionLevel? level,
bool? includeSubfolders,
bool? preserveStructure,
String? password,
bool? encryptNames,
}) {
return CompressionSettings(
format: format ?? this.format,
level: level ?? this.level,
includeSubfolders: includeSubfolders ?? this.includeSubfolders,
preserveStructure: preserveStructure ?? this.preserveStructure,
password: password ?? this.password,
encryptNames: encryptNames ?? this.encryptNames,
);
}
}
3.1.4 压缩格式使用分布
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 压缩页面结构
3.2.3 任务页面结构
3.2.4 设置页面结构
3.3 压缩流程逻辑
3.4 数据存储逻辑
四、UI设计规范
4.1 配色方案
应用以深邃的紫色为主色调,象征专业与高效:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #673AB7 (DeepPurple) | 导航、主题元素 |
| 辅助色 | #9575CD | 渐变背景 |
| 背景色 | #FAFAFA | 页面背景 |
| 卡片背景 | #FFFFFF | 信息卡片 |
| 成功色 | #4CAF50 | 完成状态 |
| 警告色 | #FF9800 | 等待状态 |
| 错误色 | #F44336 | 失败状态 |
4.2 任务状态配色
| 状态 | 色值 | 视觉效果 |
|---|---|---|
| 等待中 | #FF9800 | 橙色 |
| 压缩中 | #2196F3 | 蓝色 |
| 已完成 | #4CAF50 | 绿色 |
| 失败 | #F44336 | 红色 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 20px | Bold | 白色 |
| 文件名 | 16px | Regular | #000000 |
| 文件大小 | 12px | Regular | #666666 |
| 任务名称 | 16px | Bold | #000000 |
| 统计数值 | 12px | Bold | #000000 |
| 状态标签 | 12px | Bold | 状态色 |
4.4 组件规范
4.4.1 文件选择卡片
┌─────────────────────────────────────┐
│ 📄 项目文档.docx ☑ │
│ 2.4 MB · 1天前 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 🎨 设计稿.psd ☐ │
│ 50.0 MB · 3天前 │
└─────────────────────────────────────┘
4.4.2 选择信息栏
┌─────────────────────────────────────┐
│ 📦 已选择 3 个文件 ZIP │
│ 总大小: 85.6 MB │
└─────────────────────────────────────┘
4.4.3 任务卡片
┌─────────────────────────────────────┐
│ 📦 压缩包_1234567890.zip ✅ 已完成│
│ 3 个文件 │
│ │
│ ┌─────────────────────────────┐ │
│ │ 💾 原始大小 🗜️ 压缩后 📉 压缩率│ │
│ │ 85.6 MB 25.7 MB 70.0% │ │
│ └─────────────────────────────┘ │
│ │
│ ┌───────────┐ ┌───────────┐ │
│ │ 📁 打开位置 │ │ 🗑️ 删除 │ │
│ └───────────┘ └───────────┘ │
└─────────────────────────────────────┘
4.4.4 设置卡片
┌─────────────────────────────────────┐
│ 压缩格式 │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ ZIP │ │ RAR │ │ 7Z │ │
│ └─────┘ └─────┘ └─────┘ │
│ ┌─────┐ ┌─────┐ │
│ │ TAR │ │ GZ │ │
│ └─────┘ └─────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 压缩级别 │
│ │
│ ○ ⭕ 无压缩 - 仅打包不压缩 │
│ ○ ⚡ 快速 - 压缩速度快,压缩率低 │
│ ● ⚖️ 标准 - 平衡速度与压缩率 │
│ ○ 🗜️ 最大 - 压缩率最高,速度慢 │
└─────────────────────────────────────┘
五、核心功能实现
5.1 文件选择实现
void _toggleFileSelection(MockFile file) {
setState(() {
if (_selectedFiles.contains(file)) {
_selectedFiles.remove(file);
} else {
_selectedFiles.add(file);
}
});
}
void _selectAll() {
setState(() {
_selectedFiles = List.from(_mockFiles);
});
}
void _clearSelection() {
setState(() {
_selectedFiles.clear();
});
}
5.2 压缩任务创建
Future<void> _startCompression() async {
if (_selectedFiles.isEmpty) return;
final task = CompressionTask(
id: DateTime.now().millisecondsSinceEpoch.toString(),
name: '压缩包_${DateTime.now().millisecondsSinceEpoch}${_settings.format.extension}',
files: _selectedFiles.map((f) => f.name).toList(),
settings: _settings,
originalSize: _selectedFiles.fold(0, (sum, f) => sum + f.size),
createdAt: DateTime.now(),
);
setState(() {
_tasks.insert(0, task);
});
await _simulateCompression(task);
}
5.3 压缩进度模拟
Future<void> _simulateCompression(CompressionTask task) async {
final random = Random();
final compressionRatio = 0.3 + (task.settings.level.level / 10) * 0.4;
for (int i = 0; i <= 100; i += 5) {
await Future.delayed(const Duration(milliseconds: 100));
if (!mounted) return;
setState(() {
final index = _tasks.indexWhere((t) => t.id == task.id);
if (index != -1) {
_tasks[index] = _tasks[index].copyWith(
status: CompressionTaskStatus.compressing,
progress: i / 100,
compressedSize: (task.originalSize * (1 - compressionRatio * (i / 100))).toInt(),
);
}
});
}
setState(() {
final index = _tasks.indexWhere((t) => t.id == task.id);
if (index != -1) {
_tasks[index] = _tasks[index].copyWith(
status: CompressionTaskStatus.completed,
progress: 1,
compressedSize: (task.originalSize * (1 - compressionRatio)).toInt(),
completedAt: DateTime.now(),
);
}
});
}
5.4 压缩率计算
class CompressionTask {
final int originalSize;
final int compressedSize;
double get compressionRatio =>
originalSize > 0 ? (1 - compressedSize / originalSize) * 100 : 0;
}
5.5 设置存储实现
class CompressionStorage {
static const String _settingsKey = 'compression_settings';
static Future<void> saveSettings(CompressionSettings settings) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setStringList(_settingsKey, [
settings.format.index.toString(),
settings.level.index.toString(),
settings.includeSubfolders.toString(),
settings.preserveStructure.toString(),
settings.encryptNames.toString(),
]);
}
static Future<CompressionSettings> loadSettings() async {
final prefs = await SharedPreferences.getInstance();
final data = prefs.getStringList(_settingsKey);
if (data == null || data.length < 5) return const CompressionSettings();
return CompressionSettings(
format: CompressionFormat.values[int.tryParse(data[0]) ?? 0],
level: CompressionLevel.values[int.tryParse(data[1]) ?? 2],
includeSubfolders: data[2] == 'true',
preserveStructure: data[3] == 'true',
encryptNames: data[4] == 'true',
);
}
}
六、交互设计
6.1 文件压缩流程
6.2 任务管理流程
6.3 设置修改流程
七、扩展功能规划
7.1 后续版本规划
7.2 功能扩展建议
7.2.1 真实压缩实现
压缩功能:
- 集成archive库实现真实压缩
- 支持多种压缩算法
- 大文件分片压缩
- 断点续传支持
7.2.2 解压功能
解压功能:
- 自动识别压缩格式
- 选择性解压文件
- 解压进度显示
- 解压路径选择
7.2.3 高级功能
高级功能:
- 分卷压缩
- 自解压文件创建
- 压缩包修复
- 文件校验
八、注意事项
8.1 开发注意事项
-
大文件处理:注意内存管理,避免一次性加载大文件
-
进度更新:合理控制进度更新频率,避免UI卡顿
-
错误处理:完善的错误捕获和用户提示
-
权限管理:确保文件读写权限正确获取
-
后台任务:长时间压缩任务支持后台执行
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 压缩失败 | 权限不足 | 检查文件读写权限 |
| 进度卡住 | 文件过大 | 使用流式处理 |
| 内存溢出 | 一次性加载 | 分片处理大文件 |
| 格式不支持 | 库限制 | 提示用户更换格式 |
| 密码错误 | 加密算法 | 检查密码设置 |
8.3 使用技巧
🗜️ 文件压缩工具使用技巧 🗜️
格式选择
- 通用场景选ZIP格式
- 高压缩率选RAR或7Z
- 仅打包选TAR格式
- 单文件压缩选GZ
级别选择
- 临时文件用快速级别
- 日常使用用标准级别
- 长期存储用最大级别
- 快速打包用无压缩
安全设置
- 敏感文件设置密码
- 启用文件名加密
- 使用强密码
- 定期更换密码
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
| Web浏览器 | Chrome 90+ |
9.2 运行命令
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_file_compression.dart --web-port 8206
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_file_compression.dart
# 代码分析
flutter analyze lib/main_file_compression.dart
十、总结
文件压缩工具是一款专业的文件压缩与解压管理应用,支持ZIP、RAR、7Z、TAR、GZ五种主流压缩格式,满足不同场景的压缩需求。应用提供无压缩、快速、标准、最大四种压缩级别,用户可根据实际需求灵活选择。
核心功能涵盖文件选择、压缩格式、压缩级别、批量处理、进度显示、压缩统计、密码保护、设置持久化八大模块。用户可以批量选择文件、设置压缩参数、实时查看压缩进度,实现高效的文件压缩管理。
应用采用 Material Design 3 设计规范,以深邃的紫色为主色调,象征专业与高效。通过本应用,希望能够帮助用户高效管理文件存储空间,提升文件管理效率。
文件压缩工具——让文件管理更高效
更多推荐


所有评论(0)