You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:34:53