【发布时间】:2021-01-02 22:34:18
【问题描述】:
已编辑以包含 addFileToDB 代码
我正在开发我的第一个 dart/flutter 应用程序并试图了解为什么我对 async/await 的使用不起作用。
我在下面有 2 个代码示例。第一个例子不起作用。第二个示例有效,但我不明白为什么需要延迟。场景是 addFileToDb 插入 sqlite 记录,但 loadDbFileNames 无法将数据拉回,除非我引入延迟。对我来说,这似乎暗示“await addFileToDb(record.key, record.value);”行中的“await”没用。
Future<void> addFilesToDb(Map<String, String> filesMap) async {
_chgNState(NSDBFILESLOADING);
for (var record in filesMap.entries) {
await addFileToDb(record.key, record.value);
}
_chgNState(NSDBFILESLOADDONE);
await loadDbFileNames();
}
Future<void> loadDbFileNames() async {
_chgNState(NSDBFILENAMESLOADING);
List<Map<String, dynamic>> rows =
await db.rawQuery("select distinct(FileName) from OrderedLists");
dbFileNames.clear();
rows.forEach((row) {
dbFileNames.add(row["FileName"]);
});
_chgNState(NSDBFILENAMESLOADDONE);
}
此代码有效。
Future<void> addFilesToDb(Map<String, String> filesMap) async {
_chgNState(NSDBFILESLOADING);
for (var record in filesMap.entries) {
await addFileToDb(record.key, record.value);
}
_chgNState(NSDBFILESLOADDONE);
Future.delayed(const Duration(milliseconds: 2000), () {
loadDbFileNames();
});
}
Future<void> loadDbFileNames() async {
_chgNState(NSDBFILENAMESLOADING);
List<Map<String, dynamic>> rows =
await db.rawQuery("select distinct(FileName) from OrderedLists");
dbFileNames.clear();
rows.forEach((row) {
dbFileNames.add(row["FileName"]);
});
_chgNState(NSDBFILENAMESLOADDONE);
}
此代码在两个版本(工作和非工作)之间是相同的
Future<void> addFileToDb(String fileName, String fullFilePath) async {
var returnValue = false;
//strip the extension from the file name
fileName = fileName.split(".")[0];
//make sure file name is not already in the database
var qs = "select count(1) from OrderedLists where FileName='" +
fileName +
"' group by FileName";
var count = Sqflite.firstIntValue(await db.rawQuery(qs));
if (count == null) {
Stream<List<int>> stream = File(fullFilePath).openRead();
stream.transform(utf8.decoder).transform(LineSplitter()).listen((data) {
List<String> recList = data.split(String.fromCharCode(9));
var ListName = recList[0];
var ItemName = recList[1];
var ItemOrder = recList[2];
if (ListName != "ListName") {
var values = "'" +
fileName +
"','" +
ListName +
"','" +
ItemName +
"'," +
ItemOrder;
db.rawInsert(
"INSERT INTO OrderedLists(FileName,ListName,ItemName,ItemOrder) VALUES(" +
values +
")");
}
}, onDone: () {
//TODO
}, onError: (e) {
//TODO
});
}
}
【问题讨论】:
-
听起来您正在某处调用异步函数,但并未等待它完成。确保启用
unawaited_futureslint 并检查dartanalyer是否找到任何东西。 -
你还没有发布关键部分:
addFileToDb是做什么的?您希望它完成插入数据库,但您还没有向我们展示代码。
标签: flutter asynchronous dart async-await