// Isar 数据库初始化 — 本地持久化存储 // // Isar 3.x 要求 open() 时传入 List 位置参数。 // 由于我们使用手写不可变类而非 isar_generator 代码生成, // 需要在调用 [init] 时传入 schema 列表。 // 当前阶段使用 [ensureInitialized] 占位,待后续添加 Isar Collection 后正式注册。 import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; /// Isar 数据库单例管理 /// /// 使用方式(Phase 1 — 无 schema 时): /// ```dart /// // 直接使用,不初始化 Isar(内存仓库模式) /// ``` /// /// 使用方式(Phase 2 — 有 schema 后): /// ```dart /// final isar = await IsarDatabase.init(schemas: [JournalEntrySchema]); /// ``` class IsarDatabase { IsarDatabase._(); static Isar? _instance; static bool _initialized = false; /// 是否已初始化 static bool get isInitialized => _initialized; /// 初始化数据库(需在 app 启动时调用,传入所有 CollectionSchema) /// /// - [schemas]: Isar Collection Schema 列表(由 isar_generator 生成) /// - 在应用文档目录下创建 isar 数据库文件 /// - 开发模式开启 inspector(flutter pub global run isar_inspector) static Future init({ required List> schemas, }) async { if (_instance != null && _instance!.isOpen) return _instance!; final dir = await getApplicationDocumentsDirectory(); _instance = await Isar.open( schemas, directory: dir.path, inspector: true, // 开发模式,发布时关闭 ); _initialized = true; return _instance!; } /// 获取 Isar 实例(必须先调用 [init]) /// /// 如果未初始化会抛出 [StateError]。 static Isar get instance { if (_instance == null || !_instance!.isOpen) { throw StateError( 'IsarDatabase 未初始化,请先调用 IsarDatabase.init(schemas: [...])', ); } return _instance!; } /// 关闭数据库连接 /// /// 通常只在应用退出时调用。 static Future close() async { if (_instance != null && _instance!.isOpen) { await _instance!.close(); _instance = null; _initialized = false; } } /// 清空所有数据(仅用于测试) static Future clearAll() async { if (_instance == null || !_instance!.isOpen) return; await _instance!.writeTxn(() async { // TODO: 清空所有 collection }); } }