【问题标题】:flutter/dart await returning result too early sqlite db operations颤振/飞镖等待返回结果过早的sqlite db操作
【发布时间】: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_futures lint 并检查dartanalyer 是否找到任何东西。
  • 你还没有发布关键部分:addFileToDb 是做什么的?您希望它完成插入数据库,但您还没有向我们展示代码。

标签: flutter asynchronous dart async-await


【解决方案1】:

看起来我的 addFileToDb 使用的是异步而不是等待,所以这是我的问题。

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 2021-03-11
    • 2020-11-05
    • 1970-01-01
    • 2020-12-28
    • 2020-12-25
    • 2020-11-05
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多