Kali Mobile Dashboard 项目开发
1. 项目背景与目标
1.1 项目背景
在快节奏的现代生活中,高效管理个人时间和事务变得至关重要。虽然市面上有许多日程管理或笔记应用,但往往功能过于臃肿。为了满足本人对轻量级、集成化个性化移动办公工具的需求,本项目 Kali Mobile Dashboard 应运而生。
1.2 项目目标
本项目旨在构建一个基于 Flutter 的跨平台移动应用,核心目标包括:
日程管理:提供直观的课程表/日程表视图,支持多视图切换(极简、今日、本周、总表)。
待办事项:集成高效的 Todo List,支持单日任务、每日循环任务及周期性任务。
笔记记录:提供便捷的文本笔记功能,支持增删改查。
多端适配:基于 Flutter 实现 Android 与桌面端(Windows/Linux)的代码复用(目前重点优化 Android 端)。
2. 技术栈说明
本项目采用现代化的移动开发技术栈,确保应用的高性能与可维护性:
开发框架: Flutter (SDK ^3.11.0) - Google 开源的 UI 工具包,用于构建高性能跨平台应用。
编程语言: Dart - 强类型、面向对象的编程语言,Flutter 的开发语言。
状态管理:
provider(^6.1.5) - 官方推荐的轻量级状态管理方案,用于管理日程、待办和笔记的全局状态。本地存储:
sqflite(^2.4.2): Android/iOS 端的 SQLite 数据库插件,用于持久化存储笔记和复杂数据。shared_preferences(^2.5.4): 用于存储轻量级配置信息(如用户偏好设置)。
构建工具: Gradle (Android 构建), Flutter CLI。
其他依赖:
intl: 日期格式化与国际化。google_fonts: 字体管理。file_picker/image_picker: 文件与图片选择。spreadsheet_decoder: Excel 文件解析(用于导入课程表等)。
3. 核心文件结构解析
项目遵循 Flutter 标准工程结构,代码组织清晰,模块化程度高。
3.1 目录结构概览
d:\VSC\Project\Aapp
├── android/ # Android 原生工程目录
│ ├── build.gradle.kts # 项目级构建配置(配置了阿里云镜像源)
│ ├── settings.gradle.kts # Gradle 设置
│ └── app/ # Android App 模块
│ └── src/main/AndroidManifest.xml # 应用清单文件
├── lib/ # Flutter 核心代码目录
│ ├── main.dart # 应用入口
│ ├── models/ # 数据模型层
│ │ ├── course.dart # 课程/日程模型
│ │ ├── note.dart # 笔记模型
│ │ └── todo.dart # 待办事项模型
│ ├── providers/ # 状态管理层 (ViewModel)
│ │ ├── note_provider.dart
│ │ ├── schedule_provider.dart
│ │ └── todo_provider.dart
│ ├── screens/ # UI 视图层
│ │ ├── home_screen.dart # 主页框架(底部导航)
│ │ ├── schedule_screen.dart # 日程表页面
│ │ ├── todo_screen.dart # 待办事项页面
│ │ └── notes_screen.dart # 笔记列表页面
│ ├── services/ # 业务服务层
│ │ └── db_helper.dart # 数据库操作封装
│ ├── utils/ # 工具类
│ │ └── constants.dart # 全局常量
│ └── widgets/ # 公共组件
│ └── terminal_card.dart # 特色 UI 组件
└── pubspec.yaml # 项目依赖配置文件
3.2 关键文件职责与代码展示
lib/main.dart:职责: 程序的入口点。负责初始化 Flutter 绑定,设置全局 Provider(状态注入),并配置应用的主题和路由。
代码展示:
void main() { // 桌面端数据库初始化逻辑(目前为解决 Android 构建问题暂时注释) // if (Platform.isWindows || Platform.isLinux) { // sqfliteFfiInit(); // databaseFactory = databaseFactoryFfi; // } WidgetsFlutterBinding.ensureInitialized(); runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => TodoProvider()..loadTodos()), ChangeNotifierProvider(create: (_) => NoteProvider()..loadNotes()), ChangeNotifierProvider(create: (_) => ScheduleProvider()..loadSettings()), ], child: const MyApp(), ), ); }
lib/services/db_helper.dart:职责: 单例模式的数据库助手类。负责创建数据库表结构,提供统一的增删改查接口,隔离上层业务逻辑与底层 SQL 实现。
代码展示:
class DBHelper { static final DBHelper _instance = DBHelper._internal(); static Database? _database; factory DBHelper() => _instance; Future<Database> get database async { if (_database != null) return _database!; _database = await _initDatabase(); return _database!; } Future<Database> _initDatabase() async { String path = join(await getDatabasesPath(), 'kali_dashboard.db'); return await openDatabase( path, version: 1, onCreate: _onCreate, ); } // 创建表结构 Future<void> _onCreate(Database db, int version) async { await db.execute(''' CREATE TABLE todos( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT, status INTEGER, category TEXT, target_date TEXT, priority INTEGER, created_at TEXT ) '''); // ... notes table creation } }
lib/providers/schedule_provider.dart:职责: 管理课程数据的加载、解析和视图状态(当前周数、显示模式)。
代码展示:
class ScheduleProvider with ChangeNotifier { // 计算当前周数 int get currentWeek { if (_semesterStart == null) return 1; final now = DateTime.now(); final diff = now.difference(_semesterStart!).inDays; if (diff < 0) return 0; // Not started return (diff / 7).floor() + 1; } // 获取今日课程 List<Course> getTodayCourses() { final now = DateTime.now(); final week = currentWeek; final day = now.weekday; if (day > 5) return []; // 周末处理 return CourseData.allCourses.where((c) { return c.day == day && c.weeks.contains(week); }).toList(); } }
android/build.gradle.kts:职责: Android 构建脚本。
关键点: 修改了仓库源配置,添加了阿里云镜像(Maven Aliyun),解决了国内环境下的依赖下载超时问题。
代码展示:
allprojects { repositories { maven { url = uri("https://maven.aliyun.com/repository/public") } maven { url = uri("https://maven.aliyun.com/repository/google") } maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } google() mavenCentral() } }
4. 关键功能实现思路
4.1 动态日程表
通过 ScheduleProvider 管理课程数据。UI 层使用 GridView 或自定义 Stack 布局来绘制课程表网格。利用 provider 监听周数变化,动态过滤并显示当前周的课程。支持从 Excel 文件导入课程数据,通过 spreadsheet_decoder 解析表格内容并转换为 Course 模型对象。
4.2 待办事项管理
TodoProvider 维护待办列表。数据结构设计上,Todo 模型包含 date(日期)、isRepeat(是否每日重复)等字段。在显示逻辑上,根据当前选中的日期,筛选出“当天的单次任务”以及“所有每日重复任务”进行展示。
4.3 本地数据持久化
使用 sqflite 创建 SQLite 数据库。在应用启动时初始化数据库,若表不存在则自动创建。通过异步方法(Future)读写数据,避免阻塞 UI 线程,保证应用流畅度。
5. 开发过程中遇到的问题与解决方案
在开发和打包 APK 的过程中,遇到了一些典型的环境与构建问题,以下是详细记录与解决方案:
5.1 Gradle 依赖下载超时
问题描述:
org.gradle.internal.resolve.ArtifactResolveException: Could not download junit-jupiter-engine...。在构建过程中,Gradle 无法从 Google 和 Maven Central 下载依赖包。原因分析: 国内网络环境连接官方仓库不稳定。
解决方案: 在
android/build.gradle.kts和android/settings.gradle.kts中配置阿里云镜像源:maven { url = uri("https://maven.aliyun.com/repository/public") } maven { url = uri("https://maven.aliyun.com/repository/google") } maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") }
5.2 插件任务创建失败 (Roots different)
问题描述:
Could not create task ... this and base files have different roots。原因分析: 构建缓存路径与当前项目路径不一致,或者是 Gradle 缓存损坏。
解决方案: 执行
flutter clean清理构建缓存,然后重新运行flutter pub get和构建命令。
5.3 桌面端数据库依赖冲突
问题描述:
Execution failed for task ':app:compileFlutterBuildDebug'. 打包 Android 版本时,由于sqflite_common_ffi(主要用于桌面端)的某些原生库下载失败或配置不兼容,导致构建中断。解决方案:
在
pubspec.yaml中暂时注释掉sqflite_common_ffi。在
lib/main.dart中注释掉针对 Windows/Linux 平台的数据库初始化代码 (sqfliteFfiInit)。优先保证 Android 端的构建发布。
6. 总结与展望
6.1 总结
本项目成功实现了一个功能完备的移动端仪表盘应用。通过 Flutter 框架,高效地构建了美观且流畅的用户界面。
6.2 展望
桌面端完善: 恢复并修复
sqflite_common_ffi的配置,实现 Windows 和 Linux 端的完美支持,打通多端数据同步。功能扩展: 增加云同步功能,支持多设备间的数据实时同步。
UI 优化: 引入更丰富的动画效果和主题切换功能,还有UI设计,提升用户体验。
修复BUG