Функция не заканчивается при возврате - PullRequest
0 голосов
/ 26 апреля 2020

У меня странная проблема. У меня есть эта функция, чтобы проверить, существует ли определенная запись в sqflite, она должна возвращать true, если это так, и false, если нет. Но по какой-то причине функция не заканчивается, когда она должна возвращать true. вместо этого он всегда проходит через конец функции и возвращает false.

Вывод на консоль:

  1. существует (должен возвращать true здесь),
  2. {id : 1, messageId: 6, wasViewed: 0} (вывод результата)
  3. конец функции

И затем возвращается false.

  Future<bool> isMessageViewContained(int id) async {
    Database db = await this.database;

    await db.query(messagesViewTable, where: 'messageId = $id').then((res) {
      if (res.isEmpty) {
        print("doesnt exists");
        return false;
      }
      print("exists");
      print(res);
      return true;
    }).catchError((error) {
      print("doesnt exist");
      return false;
    });
    print("end of function");
    return false;
  }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Ваша проблема в том, что сама функция isMessageViewContained никогда не возвращает true. Он вызывает Future.then обратный вызов, и этот обратный вызов возвращает true. isMessageViewContained никогда ничего не делает с возвращаемым значением обратного вызова.

Это можно исправить, изменив await db.query(...).then(...); на return await db.query(...).then(...);. Еще понятнее было бы просто использовать await без обратных вызовов .then() и .catchError():

    Future<bool> isMessageViewContained(int id) async {
    Database db = await this.database;

    try {
      var res = await db.query(messagesViewTable, where: 'messageId = $id');
      if (res.isEmpty) {
        print("doesnt exists");
        return false;
      }
      print("exists");
      print(res);
      return true;
    } catch (error) {
      print("doesnt exist");
      return false;
    }
    print("end of function");
    return false;
  }
0 голосов
/ 26 апреля 2020

Это потому, что оно выполняется в следующем порядке:

  1. Старт
  2. ЖДИТЕ СЛЕДУЮЩИХ ШАГОВ (ЗВОНКОВ) В FINI SH (ввод асин c context)
  3. выполнить db.query
  4. Когда db.query завершит работу, выполните печать («существует») и верните true - на этом шаге не функция
  5. OK, ШАГИ ЗАВЕРШЕНЫ, давайте продолжим ( выход из асинхронного c контекста)
  6. print ("конец функции")
  7. возврат false

Так что из-за асинхронного c контекста вы выполняете требуемый код в качестве обратного вызова функции asyn c, который основной поток ожидает до конца sh - и продолжается после этого.

короче это похоже на

 Database db = this.database;
 queryDb(someCriteria); // result is ignored
 print("end of function");
 return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...