我有一个flutter应用程序,我在其中使用SQFLITE插件从SQLite DB中获取数据。这里我面临一个奇怪的问题。根据我的理解,我们使用async/wait或then()函数进行异步编程。这里我有一个db.query()方法,它执行一些SQL查询以从DB中获取数据。在这个函数获取数据后,我们在. then()函数中做一些进一步的处理。然而,在这种方法中,我遇到了一些问题。从我调用getExensesByFundId(int fundId)函数的地方来看,它似乎没有正确获取数据。它应该返回Future
然而,我只是做了一些实验,并在数据库前面添加了“wait”关键字。query()函数,但不知怎么的,它刚刚开始正常工作。你能解释一下为什么添加wait关键字可以解决这个问题吗?我在使用时想。然后()函数,我们不需要使用wait关键字。
这是我的代码:
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;
}
当让类使用async
来使用await
时,它的简单逻辑是在函数中创建等待状态,直到数据被检索出来显示。
示例:1)单击按钮时类似于2)数据首先存储在数据库中,而不是未来
函数用于检索数据3)将该数据移动到变量中,然后在屏幕中显示4)变量在以下/配置文件中显示类似增量。
然后是一步一步地使用代码,将数据存储在变量中,然后移动到下一步。
示例:如果我点击follow按钮,直到data store in variable,它会连续检索一些要存储的数据,并且不允许下一个函数运行,如果一个任务完成,则移动到另一个任务。
和你的问题一样,我也在做社交媒体flutter应用程序的实验,这是我的理解。我希望这会有所帮助。
补充以上答案。
颤振应用程序据说是一步一步地执行代码,但事实并非如此。在应用程序的生命周期中会触发很多事件,比如点击事件、计时器等等。一定有一些代码应该在后台线程中运行。
后台工作如何执行:
因此有两个队列
微任务队列
运行不应该由任何事件(单击、计时器等)运行的代码。它可以包含同步和异步工作。
事件队列
在应用程序中发生任何外部单击事件(如单击事件)时运行,然后阻止在事件循环内执行。
下图将详细解释执行将如何进行。
注意:在任何给定的作用点,微任务队列将运行,然后只有事件队列将能够运行。
用简单的话来说:
await
用于中断流程,直到async
方法完成<但是,code>then不会中断流程(意味着将执行下一条指令),而是允许您在async
方法完成时运行代码。
在您的示例中,当您使用then
时,您无法实现您想要的,因为代码没有“等待”,并且return
语句被处理,因此返回一个空列表。
当您添加wait
时,您明确地说:'在我的Future
方法完成之前不要进一步(即然后
部分)。
您可以编写如下代码以仅使用wait
实现相同的结果:
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;
}
您也可以选择只使用然后
部分,但需要确保之后正确调用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) { /*...*/ });
我正在尝试执行一些相互引用作为外键的查询,因此我必须等到外部未来完成。此算法放置在返回未来的函数中。 运行它时,我得到了这个: === TO CLIENT === 已完成存档 已完成全部 === TO CLIENT === 失败的 单词已完成 的单词 已完成 标记在博客中 完成投票 所以我的问题是,我怎么能等到未来的< code>mysql完成它的“childs”(在< code>whenComp
在flutter示例页面中,有一个名为“将数据发送到新屏幕”的项目。我对第65行的构造函数有一个重新保护的问题。
我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)
自从我开始使用Flatter以来,我面临着一个与Flatter async await相关的问题。大多数时候,我试图用未来和等待的结果,它跳过等待,并得到最短的方式返回 请帮助我更好地理解flatter async wait,或者告诉我哪里做错了,这样我就可以改进我的代码
我试图改变从API返回的日期字符串的格式。下面的日期格式输入字符串在java中工作正常,但在Dart中则不行。
我一直在使用VSCode进行颤振开发,但没有问题。今天,飞镖分析器突然抱怨说,大多数类都是未定义的,或者目标不存在。 有人见过这个吗? 我已经重新启动了VSCode,重新启动了计算机,卸载了flutter/dart插件,运行flutter dr没有任何问题……我没有想法了。 VSCode问题