Flutter集成SQFLite时getApplicationDocumentsDirectory空校验报错如何解决
问题解决方案
你触发报错的核心原因是main函数内初始化顺序错误:
你当前的main函数逻辑是先初始化ProductController,再初始化Flutter引擎绑定:
Future<void> main() async { Get.put(ProductController()); // 此处提前触发了DatabaseHelper初始化 WidgetsFlutterBinding.ensureInitialized(); // 引擎绑定初始化晚于数据库调用 await Hive.initFlutter(); runApp(MyApp()); }
调用getApplicationDocumentsDirectory()时必须保证Flutter引擎已经完成绑定初始化,而你在初始化ProductController的时候,提前调用了DatabaseHelper的数据库实例获取逻辑,此时引擎还没初始化完成,直接触发报错。
只要调整执行顺序即可修复问题:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); // 优先完成引擎绑定 await Hive.initFlutter(); Get.put(ProductController()); // 再初始化控制器和数据库逻辑 runApp(MyApp()); }
其他可优化的潜在问题
你的DatabaseHelper类里还有两处隐患,建议同步修改:
- 单例实现逻辑错误
当前的工厂方法判断逻辑写反,每次调用都会创建新的实例,完全失去单例意义:
// 原错误写法 factory DatabaseHelper() { if (databaseHelper != null) { // 实例不为空反而重新创建 databaseHelper = DatabaseHelper._createInstance(); } return databaseHelper; } // 修改后正确写法 factory DatabaseHelper() { databaseHelper ??= DatabaseHelper._createInstance(); return databaseHelper; }
- 批量插入逻辑未等待异步操作完成
你用forEach包裹异步插入操作,外层不会等待所有插入完成就直接返回,可能出现后续操作读取不到刚插入数据的问题,修改为:
Future<List<Product>> insertProduct(List<Product> product) async { Database db = await databaseHelper.database; // 用Future.wait等待所有插入操作执行完毕 await Future.wait(product.map((element) => db.insert(productTable, element.toJson()))); print('was inserted'); return product; }
完成上述调整后重新运行项目即可解决报错。
内容的提问来源于stack exchange,提问作者Zionnite
相关产品推荐
相关产品推荐

