异步/等待/然后在DART /颤振

问题描述 投票:0回答:1

我在那里我使用SQFLITE插件来从sqlite的DB数据扑应用。在这里,我面临着一个奇怪的问题。按我的理解,我们使用异步编程或者异步/坐等或则()函数。这里我有正在进行一些SQL查询来从DB获取数据的db.query()方法。此功能后获取数据,我们做的。那么()函数的一些进一步的处理。然而,在这种方法中,我遇到了一些问题。从哪里我打电话这个getExpensesByFundId(INT fundId)功能,它似乎并没有正确地获取数据。它应该回到未来>对象将被然后转换当数据可用到列表。但是,当我把它不起作用。

不过,我只是做了一些实验与它添加在db.query()函数的前“等待”的关键字,并不知它刚开始工作的罚款。你能解释为什么添加的await关键字是解决这个问题?我想用。那么()函数的时候,我们并不需要使用的await关键字。

这里是我的代码:

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();

   // The await in the below line is what I'm talking about

    await db.query(expTable,where: '$expTable.$expFundId = $fundId')
        .then((List<Map<String,dynamic>> expList){
      expList.forEach((Map<String, dynamic> expMap){
        expenseList.add(Expense.fromMap(expMap));
      });
    });
    return expenseList;
  }
asynchronous dart flutter
1个回答
5
投票

在简单的话:

await意味着直到异步方法完成中断的处理流程。然而then不中断的流程(这意味着将要执行的下一个指令),但可让您在异步方法完成运行代码。

在你的榜样,你不能达到你想要什么,当你使用then因为代码是不是“等待”和return语句处理,因此返回一个空列表。

当您添加await,你explicitey说:“不走的更远,直到我的Future完成(在then部分)。

如下只await来达到同样的效果,你可以写你的代码:

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();

    List<Map<String,dynamic>> expList = await db.query(expTable,where: '$expTable.$expFundId = $fundId');
    expList.forEach((Map<String, dynamic> expMap) {
        expenseList.add(Expense.fromMap(expMap));
    });

    return expenseList;
}

你也可以选择只使用then一部分,但你需要确保调用getExpensesByFundId正确后:

Future<List<Expense>> getExpensesByFundId(int fundId) async {
    Database db = await database;

    List<Expense> expenseList = List();

    return db.query(expTable,where: '$expTable.$expFundId = $fundId')
        .then((List<Map<String,dynamic>> expList){
      expList.forEach((Map<String, dynamic> expMap){
        expenseList.add(Expense.fromMap(expMap));
      });
    });
}

// call either with an await
List<Expense> list = await getExpensesByFundId(1);
// or with a then (knowing that this will not interrupt the process flow and process the next instruction
getExpensesByFundId(1).then((List<Expense> l) { /*...*/ });
© www.soinside.com 2019 - 2024. All rights reserved.