Flutter初始化数据库时报LateInitializationError字段未初始化错误
问题原因
核心错误来自AlarmHelper类中late关键字的错误使用:
late修饰的变量相当于你向编译器承诺该变量在被访问前一定会完成赋值,不能对其做空值判断- 工厂构造函数第一次执行时,会先判断
_alarmHelper == null,此时late修饰的_alarmHelper还未赋值,直接触发LateInitializationError报错 - 同理
_database变量也存在相同的late使用错误
解决方案
第一步:修改AlarmHelper类代码
直接替换为以下修正后的代码,取消错误的late使用,优化单例和数据库初始化逻辑:
import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; import 'package:weather_alarm_app/models/alarm_info.dart'; final String tableName = 'alarm'; final String id = 'id'; final String title = 'title'; final String dateTime = 'dateTime'; // 修正了你之前拼写错误的dataTime final String pending = 'isPending'; final String color = 'gradientColorIndex'; class AlarmHelper{ static Database? _database; // 直接初始化单例,取消late和空判断 static final AlarmHelper _alarmHelper = AlarmHelper._createInstance(); AlarmHelper._createInstance(); factory AlarmHelper() { return _alarmHelper; } Future<Database> get database async{ if (_database == null){ _database = await initializeDatabase(); } return _database!; } Future<Database> initializeDatabase() async{ var dir = await getDatabasesPath(); // 用join方法拼接路径,兼容不同平台的路径分隔符 var path = join(dir, "alarm.db"); var database = await openDatabase(path, version: 1, onCreate: (db, version){ db.execute(''' create table $tableName( $id integer primary key autoincrement, $title text not null, $dateTime text not null, $pending integer, $color integer ) '''); }); return database; } // 修正了你之前拼写错误的insetAlarm方法名,改为标准insertAlarm Future<int> insertAlarm(AlarmInfo alarmInfo) async{ var db = await this.database; var result = await db.insert(tableName, alarmInfo.toMap()); print("闹钟插入结果:$result"); return result; } }
记得在pubspec.yaml的dependencies下添加path依赖,用于路径拼接:
dependencies: flutter: sdk: flutter path: ^1.8.3 # 版本号匹配你的Flutter SDK版本即可
第二步:优化AddAlarmScreen的异步调用
你当前页面的初始化逻辑是正常的,只需要修正悬浮按钮点击的异步逻辑,避免空指针:
floatingActionButton: FloatingActionButton(onPressed: () async { // 先做判空校验,避免空指针崩溃 if(date == null || time == null || title.trim().isEmpty) { // 这里可以加个toast提示用户补全信息 return; } DateTime finalDateTime = DateTime(date.year, date.month, date.day, time.hour, time.minute); var alarmInfo = AlarmInfo( title: title, dateTime: finalDateTime, gradientColorIndex: alarms.length, id: alarms.length, isPending: true ); // 等待数据库插入完成 await _alarmHelper.insertAlarm(alarmInfo); // 插入完成后可以执行返回页面、刷新闹钟列表等逻辑 }, child: Icon(Icons.add,),),
内容的提问来源于stack exchange,提问作者Skrrubs
相关产品推荐
相关产品推荐

