Asynchronous 在dart中的类中使用从未来返回的值
你好,我有以下代码Asynchronous 在dart中的类中使用从未来返回的值,asynchronous,dart,Asynchronous,Dart,你好,我有以下代码 class TodoProvider { Database db; TodoProvider() { _initDatabase(); print("Db is >>>>> $db"); } void _initDatabase() async { final database = await AppDatabase().connect(); db = database; } Fut
class TodoProvider {
Database db;
TodoProvider() {
_initDatabase();
print("Db is >>>>> $db");
}
void _initDatabase() async {
final database = await AppDatabase().connect();
db = database;
}
Future<Todo> insertTodo(Todo todo) async {
todo.id = await db.insert('todo', todo.toMap());
return todo;
}
Future<Todo> getTodo(int id) async {
List<Map<String, dynamic>> maps =
await db.query('todo', where: 'id=?', whereArgs: [id]);
if (maps.length > 0) {
return Todo.fromMap(maps.first);
}
return null;
}
Future<int> deleteTodo(int id) async {
return await db.delete('todo', where: 'id=?', whereArgs: [id]);
}
Future<int> updateTodo(Todo todo) async {
return await db
.update('todo', todo.toMap(), where: 'id=?', whereArgs: [todo.id]);
}
Future close() async => db.close();
}
类TodoProvider{
数据库数据库;
TodoProvider(){
_initDatabase();
打印(“Db为>>>>$Db”);
}
void _initDatabase()异步{
最终数据库=等待AppDatabase().connect();
db=数据库;
}
未来插入Todo(Todo Todo)异步{
todo.id=await db.insert('todo',todo.toMap());
返回待办事项;
}
未来getTodo(int-id)异步{
列表地图=
wait db.query('todo',其中:'id=?',wherergs:[id]);
如果(maps.length>0){
返回Todo.fromMap(maps.first);
}
返回null;
}
未来的deleteTodo(int-id)异步{
return wait db.delete('todo',其中:'id=?',wherergs:[id]);
}
将来的updateTodo(Todo Todo)异步{
返回等待数据库
.update('todo',todo.toMap(),其中:'id=?',其中rgs:[todo.id]);
}
Future close()异步=>db.close();
}
AppDatabase是一个公开connect()方法的类,该方法返回一个future
目标是将AppDatabase返回的值分配到db类变量中
TodoProvider类中的大多数方法都依赖于db类变量来处理数据库
问题是类变量db始终为null您现在编写的代码取决于在异步操作中设置的
db
变量。有两种方法可以解决此问题:
使用静态生成器方法
您可以创建一个私有构造函数,该构造函数可以由静态方法调用,该方法允许返回用户可以等待的Future
class TodoProvider {
...
TodoProvider._(this.db) {
print("Db is >>>>> $db");
}
static Future<TodoProvider> getInstance() async {
return TodoProvider._(await AppDatabase().connect());
}
...
}
当您调用_initDatabase时,它是一个异步函数,同时调用wait时,您必须等待它完成。当它没有完成连接时,数据库将始终为空。也许你试图建立的联系是错误的。请尝试更新您的代码,并向我们显示数据库的路径、端口、数据库是否正在运行等@Kohls如果我在TodoProvider构造函数方法中等待来自_initDatabase的结果,则会导致错误。如何获取db变量以保存来自AppDatabase()的数据。connect();我不知道AppDatabase()做什么,也不知道connect(),没有足够的数据提供帮助。我会调用getInstance()方法吗?好的,我只是把它放在TodoProvider构造函数上。。。。。。看起来很好啊,好的,我现在明白了。是的,私有构造函数和getInstance()应该放在TodoProvider类中。对不起,我没有说清楚:)
class TodoProvider {
Future<Database> _db;
TodoProvider() {
_initDatabase();
print("Db is >>>>> $db");
}
void _initDatabase() {
_db = AppDatabase().connect();
}
Future<Todo> insertTodo(Todo todo) async {
final db = await _db;
todo.id = await db.insert('todo', todo.toMap());
return todo;
}
Future<Todo> getTodo(int id) async {
final db = await _db;
List<Map<String, dynamic>> maps =
await db.query('todo', where: 'id=?', whereArgs: [id]);
if (maps.length > 0) {
return Todo.fromMap(maps.first);
}
return null;
}
Future<int> deleteTodo(int id) async {
final db = await _db;
return await db.delete('todo', where: 'id=?', whereArgs: [id]);
}
Future<int> updateTodo(Todo todo) async {
final db = await _db;
return await db
.update('todo', todo.toMap(), where: 'id=?', whereArgs: [todo.id]);
}
Future close() async {
final db = await _db;
db.close();
}
}