Flutter使用ObjectBox报错:同一路径已有打开的Store(错误码10001)
Flutter ObjectBox 重复打开存储路径错误解决
错误信息
StateError (Bad state: failed to create store: Cannot open store: another store is still open using the same path: "/data/data/com.example.my_app/app_flutter/objectbox" (OBX_ERROR code 10001))
问题原因
该错误核心是同一存储路径下已有一个ObjectBox Store实例处于打开状态,重复调用openStore导致资源冲突。常见触发场景:
- 热重载/热重启时,旧的Store实例未被正确关闭
- 代码中多处调用
ObjectBox.init(),重复初始化 - 应用进程残留,导致Store资源未释放
解决方案
1. 实现Store单例模式并添加关闭方法
修改object_box.dart,确保全局只有一个Store实例,并提供关闭方法:
import 'package:objectbox/objectbox.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; class ObjectBox { static ObjectBox? _instance; late final Store _store; late final Box<RoutineDB> _routineBox; late final Box<ExerciseDB> _exerciseBox; ObjectBox._init(this._store) { _routineBox = Box<RoutineDB>(_store); _exerciseBox = Box<ExerciseDB>(_store); } static Future<ObjectBox> init() async { // 单例检查,避免重复初始化 if (_instance != null) return _instance!; final dir = await getApplicationDocumentsDirectory(); final store = await openStore(directory: p.join(dir.path, "objectbox")); _instance = ObjectBox._init(store); return _instance!; } // 关闭Store并重置单例 void close() { _store.close(); _instance = null; } }
2. 监听应用生命周期,处理热重载
在main函数中添加生命周期监听,确保热重载时旧Store被关闭并重新初始化:
import 'package:flutter/material.dart'; import 'your_objectbox_path.dart'; // 替换为你的object_box.dart路径 late ObjectBox objectBox; Future main() async { WidgetsFlutterBinding.ensureInitialized(); objectBox = await ObjectBox.init(); // 添加生命周期监听 WidgetsBinding.instance.addObserver(LifecycleObserver(objectBox)); runApp(const MyApp()); } class LifecycleObserver extends WidgetsBindingObserver { final ObjectBox objectBox; LifecycleObserver(this.objectBox); @override void didChangeAppLifecycleState(AppLifecycleState state) { // 应用进入后台时关闭Store if (state == AppLifecycleState.inactive) { objectBox.close(); } // 应用回到前台时重新初始化 else if (state == AppLifecycleState.resumed) { ObjectBox.init().then((value) => objectBox = value); } } }
3. 排查重复初始化调用
全局搜索代码中的ObjectBox.init(),确保仅在main函数中调用一次,避免其他页面或逻辑重复触发初始化操作。
4. 清理Android平台残留进程
如果是Android设备上出现该问题:
- 卸载应用后重新安装
- 杀死应用进程后重启
- 在开发者选项中关闭「不保留活动」选项
内容的提问来源于stack exchange,提问作者Ashton Valeroso
相关产品推荐
相关产品推荐

