Flutter初始化SQLite数据库失败:databaseFactory未初始化
解决Flutter中SQLite初始化报错:Bad state: databaseFactory not initialized
问题重现
尝试在Flutter中初始化SQLite数据库时遇到以下错误:
Error: Bad state: databaseFactory not initialized
所用代码及依赖如下:
数据库初始化代码
static Future<void> initdb() async { final databasePath = await getDatabasesPath(); final path = join(databasePath, 'models.db'); _database = await openDatabase(path, version: 1, onCreate: (db, version) { return db.execute( 'CREATE TABLE models(id INTEGER PRIMARY KEY, barcode TEXT, type TEXT, brand TEXT, color TEXT, gender TEXT, price REAL, total INTEGER)', ); }); }
pubspec.yaml依赖配置
dependencies: flutter_svg: 2.0.4 sqflite: 2.2.8 path_provider: 2.0.14 flutter: sdk: flutter
main.dart调用代码
void main() async{ await ModelDatabase.initdb(); runApp(MyApp()); }
已尝试flutter clean、重新验证缓存,使用官方SQLite示例代码也出现相同错误,当前环境为Android Studio 2022.1.1。
解决方案
这个错误的核心是在runApp前执行异步插件操作时,Flutter核心绑定未初始化,只需在数据库初始化前手动初始化WidgetsFlutterBinding即可:
修改main.dart代码:
import 'package:flutter/material.dart'; // 确保导入此包 void main() async{ WidgetsFlutterBinding.ensureInitialized(); // 手动初始化绑定 await ModelDatabase.initdb(); runApp(MyApp()); }
原理说明
runApp方法会自动初始化WidgetsFlutterBinding,但如果在它之前调用依赖原生通道的插件(如sqflite、path_provider),插件无法与原生端建立通信,就会触发databaseFactory not initialized错误。提前调用WidgetsFlutterBinding.ensureInitialized()可以解决这个顺序问题。
额外排查步骤
如果问题仍存在,可尝试:
- 执行
flutter pub get确保依赖完全安装 - 重启IDE和运行设备
- 检查代码中是否有提前访问数据库实例的逻辑,打乱初始化顺序
内容的提问来源于stack exchange,提问作者ramdolpix
相关产品推荐
相关产品推荐

