由于Flutter null安全问题,数据库对象拒绝初始化



我一直在尝试在没有提供商的情况下实现一个简单的to Do应用程序(为了课程(,以按照讲师的预期速度在课程中取得进步。但是我似乎找不到解决这个小问题的办法。。在下面的代码中,变量database无论如何都不希望被初始化。应该检索数据(查询(的getData()方法不会初始化变量database,即使我在initState()中的createDatabase()中调用它。它一直给出以下错误:

"I/flutter(5171(:error LateInitializationError:字段"database"尚未初始化。打开、关闭时。。。E/flutter(5171(:[错误:flutter/lib/ui_dart_state.cc(209(]未处理的异常:LateInitializationError:字段"database"尚未初始化。''

import 'package:intl/intl.dart';
import 'package:sqflite/sqflite.dart';
import 'package:to_do_app/modules/todo_app/archived/archived_screen.dart';
import 'package:to_do_app/modules/todo_app/done/done_screen.dart';
import 'package:to_do_app/modules/todo_app/tasks/tasks_screen.dart';
class HomeLayout extends StatefulWidget {
const HomeLayout({ Key? key }) : super(key: key);
@override
State<HomeLayout> createState() => _HomeLayoutState();
}
class _HomeLayoutState extends State<HomeLayout> {
int currentIndex = 0;

List<String> titles = [
'Tasks',
'Done Tasks',
'Archived Tasks',
];
List<Map> tasks = [];
late Database database;
var scaffoldKey = GlobalKey<ScaffoldState>();
bool isOpen = false;
IconData fabIcon = Icons.edit;
var titleController = TextEditingController();
var dateController = TextEditingController();
var timeController = TextEditingController();
var formKey = GlobalKey<FormState>();
@override
void initState()  {
super.initState();
createDatabase();
}
@override
Widget build(BuildContext context) {
List <Widget> screens = [
NewTasksScreen(),
DoneTasksScreen(),
ArchivedTasksScreen()
];

return Scaffold(
key: scaffoldKey,
appBar: AppBar(
title: Text(titles[currentIndex]),
),
floatingActionButton: FloatingActionButton(
onPressed: ()  {
if(isOpen == false){
isOpen = true;
setState(() {
fabIcon = Icons.add;
});
scaffoldKey.currentState!.showBottomSheet(
(context) => SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20),
child: Form(
key: formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextFormField(
validator: (value){
if(value!.isEmpty){
return 'title must not be empty';
}
},
controller: titleController,
decoration: InputDecoration(
labelText: 'Title',
prefixIcon: Icon(
Icons.title
),
),
),
SizedBox(height: 10),
TextFormField(
onTap: (){
showDatePicker(
context: context, 
initialDate: DateTime.now(), 
firstDate: DateTime.now(), 
lastDate: DateTime(2025)
).then((value) {
dateController.text =  DateFormat.yMMMMd().format(value!);
});
},
validator: (value){
if(value!.isEmpty){
return 'date must not be empty';
}
},
controller: dateController,
decoration: InputDecoration(
labelText: 'Date',
prefixIcon: Icon(
Icons.date_range
),
),
),
SizedBox(height: 10),
TextFormField(
onTap: (){
showTimePicker(
context: context, 
initialTime: TimeOfDay.now()
).then((value) {
timeController.text = value!.format(context);
});
},
validator: (value){
if(value!.isEmpty){
return 'time must not be empty';
}
},
controller: timeController,
decoration: InputDecoration(
labelText: 'Time',
prefixIcon: Icon(
Icons.timer
),
),
),
],
),
),
),
),
).closed.then(
(value) {
isOpen = false;
}
);
} else {
if (formKey.currentState!.validate()) {
insertIntoDatabase(
title: titleController.text,
date: dateController.text,
time: timeController.text
).then((value) {
Navigator.pop(context);
isOpen = false;
setState(() {
fabIcon = Icons.edit;
});
});
}

}
},
child: Icon(
fabIcon
),
),
bottomNavigationBar: BottomNavigationBar(
elevation: 20,
type: BottomNavigationBarType.fixed,
currentIndex: currentIndex,
items: [
BottomNavigationBarItem(
icon: Icon(
Icons.task_alt
),
label: 'new tasks'
),
BottomNavigationBarItem(
icon: Icon(
Icons.done
),
label: 'done tasks'
),
BottomNavigationBarItem(
icon: Icon(
Icons.archive_outlined
),
label: 'archived tasks'
)
],
onTap: (index){
setState(() {
currentIndex = index;
});
},
),
body: screens[currentIndex],
);
}
Future getName() async {
return 'Ahmad Ali';
}

void createDatabase() async {
database = await openDatabase(
'todo.db',
version: 1,
onCreate: (database, version)  {
print('databse created');
database.execute(
'CREATE TABLE tasks(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, date TEXT, time TEXT, status TEXT)'
).then(
(value) {
print('table created');
}
).catchError(
(error){
print('error creating table ${error.toString()}');
}
);
},
onOpen: (databse)  async {
print('database opened');
await getData(database).then((value) {
tasks = value;
print(tasks);
});
}
);
}
Future insertIntoDatabase({
required String title,
required String date,
required String time
}
) async {
return await database.transaction(
(txn) {
return txn.rawInsert(
'INSERT INTO tasks (title, date, time, status) VALUES ("$title", "$date", "$timeController", "new")'
).then(
(value) {
print('$value inserted succsessfully');
}
).catchError(
(error){
print('error inserting into table ${error.toString()}');
}
);
}
);
}

Future<List<Map>> getData(Database database) async {
return await database.rawQuery('SELECT * FROM tasks');
}

} ```

尝试初始化

late Database database;

在StatefulWidget中而不是它的State中,并且在createDatabase((中像一样调用它

widget.database = await OpenDatabase...

还要试着看看在initState中添加wait是否有帮助。

而不是后期数据库;

写入静态数据库?数据库

最新更新