Асинхронная функция возвращает ноль - PullRequest
0 голосов
/ 07 февраля 2020

dayManager.getDay () возвращает ноль вместо карты

@override
void initState() {
    super.initState();
    print("init");
    getDay();
  }

  void getDay() async {
    Future<Map<int, int>> dayExistingValueMap = dayManager.getDay();
    dayExistingValueMap.then((map) {
      print('dayExisting ____ $map');
    });
  }

, но когда я распечатываю ее перед возвратом, карта содержит все значения.

    Future<Map<int, int>> getDay() async {
    final Future<Database> dbFuture = databaseHelper.initializeDatabase();
    dbFuture.then((database) async {
      final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
      if (checkIfExists) {
        Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
        print('_${dbDay.valueMap}');
        return dbDay.valueMap;
      } else {
        return this.day.valueMap;
      }
    });
  }

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

Вместо return dbFuture.then((database) async { мы можем использовать final Database dbFuture = await databaseHelper.initializeDatabase();

Future<Map<int, int>> getDay() async {
    final Database dbFuture = await databaseHelper.initializeDatabase();

      final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
      if (checkIfExists) {
        Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
        print('_${dbDay.valueMap}');
        return dbDay.valueMap;
      } else {
        return this.day.valueMap;
      }

  }
0 голосов
/ 07 февраля 2020

Вы возвращаете значение в замыкании внутри then, поэтому, что касается метода getDay, вы ничего не возвращаете. Я рекомендую вообще не использовать then, так как это напрямую вызывает путаницу такого рода. (Не говоря уже о том, что вызов then лишает цели пометки вашего метода как async, который должен использовать await).

Future<Map<int, int>> getDay() async {
  final database = await databaseHelper.initializeDatabase();
  final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
  if (checkIfExists) {
    Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
    print('_${dbDay.valueMap}');
    return dbDay.valueMap;
  } else {
    return this.day.valueMap;
  }
}
0 голосов
/ 07 февраля 2020

Ваша функция возвращает ноль, поскольку вы на самом деле ничего не возвращаете. Вам необходимо вернуть результат dbFuture.then, например, так:

    Future<Map<int, int>> getDay() async {
      final Future<Database> dbFuture = databaseHelper.initializeDatabase();
      return dbFuture.then((database) async {
        final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
        if (checkIfExists) {
          Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
          print('_${dbDay.valueMap}');
          return dbDay.valueMap;
        } else {
          return this.day.valueMap;
        }
      });
    }

Future.then возвращает Future, которое завершается возвращаемым значением предоставленного замыкания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...