Flutter使用sqflite时Repository类静态Database字段初始化报错如何解决
报错原因与修复方案
核心报错根源
你遇到的报错来自Dart空安全的两个强制规则:
- 非空实例字段必须在构造函数体执行前完成初始化,你将
_databaseConnection的赋值放在构造函数大括号(构造函数体)内,不属于合法的初始化时机 - 静态非空字段必须在声明时初始化,你原本的静态字段
_database是非空类型,仅加late但没有匹配初始化逻辑,或者没同时修复_databaseConnection的初始化问题时,都会持续触发报错
具体修复步骤
1. 修复_databaseConnection初始化
推荐直接在字段声明时完成赋值,省去构造函数内的赋值逻辑:
// 直接声明时赋值,符合空安全初始化要求 DatabaseConnection _databaseConnection = DatabaseConnection();
如果你要保留构造函数内的初始化逻辑,需要放在初始化列表中:
Repository() : _databaseConnection = DatabaseConnection();
2. 修复静态字段_database的空安全声明
你原本的代码已经做了_database != null的非空判断,直接将其声明为可空类型是最适配你现有逻辑的方案,比加late更安全:
// 改为可空类型,默认初始值为null,适配你懒加载的逻辑 static Database? _database;
对应的getter方法里,返回时加非空断言即可(你已经提前判断了非空,断言不会触发异常):
Future<Database> get database async { if (_database != null) return _database!; _database = await _databaseConnection.setDatabase(); return _database!; }
3. 顺带修复DatabaseConnection类的隐藏问题
你的DatabaseConnection类还有两个会导致后续运行报错的问题,一并修复:
setDatabase方法缺少返回值类型声明- 建表SQL语句末尾缺少右括号,存在语法错误
修复后的代码:
import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; class DatabaseConnection { // 补全返回值类型 Future<Database> setDatabase() async { var directory = await getApplicationDocumentsDirectory(); var path = join(directory.path, 'db_todo_sqflite'); var database = await openDatabase(path, version: 1, onCreate: _onCreateDatabase); return database; } _onCreateDatabase(Database database, int version) async { // 补全SQL的右括号 await database.execute( "CREATE TABLE categories(id INTEGER KEY , name TEXT , descrption TEXT)"); } }
修复后的完整Repository类代码
import 'package:sqflite/sqflite.dart'; import 'package:todo/repositories/database_connection.dart'; class Repository { // 修复:声明时直接初始化 DatabaseConnection _databaseConnection = DatabaseConnection(); // 修复:改为可空静态字段 static Database? _database; Future<Database> get database async { if (_database != null) return _database!; _database = await _databaseConnection.setDatabase(); return _database!; } insertData(table, data) async { var connection = await database; return await connection.insert(table,data); } }
内容的提问来源于stack exchange,提问作者ingmbk
相关产品推荐
相关产品推荐

