Flutter:无需传参从其他类访问主类ObjectBox实例的实现方法
无需参数传递访问ObjectBox实例的解决方案
下面提供两种无需层层传递参数,就能在class3中访问main.dart初始化的ObjectBox实例的实现方式:
方法一:将ObjectBox改造为单例模式
直接修改你的ObjectBox类,添加静态单例实例,确保整个App中只有一个实例且可全局访问:
import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'objectbox.g.dart'; class ObjectBox { /// The Store of this app. late final Store store; // 静态单例实例,全局可访问 static late ObjectBox instance; ObjectBox._create(this.store) { // 初始化时将当前实例赋值给单例变量 instance = this; // 原有额外初始化代码保留 } static Future<ObjectBox> create() async { final docsDir = await getApplicationDocumentsDirectory(); final store = await openStore(directory: p.join(docsDir.path, "obx-example")); return ObjectBox._create(store); } }
在class3中的使用方式
无需传递任何参数,直接通过单例访问:
// class3的示例代码 class Class3 extends StatelessWidget { const Class3({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 直接获取ObjectBox实例的store final box = ObjectBox.instance.store.box<YourEntity>(); // 执行数据库操作,例如查询所有数据 final dataList = box.getAll(); return Text("数据总数:${dataList.length}"); } }
方法二:使用全局变量(简单直接)
如果你不想修改ObjectBox类,可以将main中的全局变量抽离到单独文件,方便其他类导入访问:
- 创建
globals.dart文件:
import 'package:your_app/objectbox.dart'; // 替换为你的ObjectBox文件路径 // 声明全局ObjectBox变量 late ObjectBox objectbox;
- 修改main.dart导入该文件并赋值:
import 'globals.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化并赋值给全局变量 objectbox = await ObjectBox.create(); runApp(const MyHomePage(initialDate: DateTime.now())); }
- class3中的使用:
import 'globals.dart'; class Class3 extends StatelessWidget { const Class3({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final box = objectbox.store.box<YourEntity>(); final data = box.get(1); // 示例:获取ID为1的数据 return Text("数据内容:${data?.toString()}"); } }
内容的提问来源于stack exchange,提问作者yoohoo
相关产品推荐
相关产品推荐

