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();
  }
}