繁体   English   中英

Flutter异步代码中的执行顺序错误

[英]Wrong order of execution in Flutter asynchronous code

我在Flutter应用中遇到了期货问题。

void saveCats() async {
  var cats = await convertToCats(_rawData);
  await DatabaseProvider.db.addCats(cats);
}

Future<List<Cat>> convertToCats(CatList catData) async {
  var cats = <Cat>[];
  await catData.forEach(key, value) async {
    var pos = await calculatePos();
    print('This should come first');
    cats.add(Cat(name: key, pos: pos);
  }
}

Future<int> calculatePos() async {
  return await DatabaseProvider.db.calculatePos();
}

database.dart:

Future<void> addCats(List<Cat> cats) async {
  print('This should come second');
  // Do adding stuff here
}

Future<int> calculatePos() async {
  // Some code to calculate the position
  return pos;
}

在上面的代码中,点击按钮时将调用saveCats函数。 此功能将一些原始数据转换为Cat模型列表,并将其添加到数据库中。 作为此转换过程的一部分,它将计算列表中猫的pos 我的问题是,我希望在我的两个print语句中, forEach循环中的一个应该在addCats数据库函数中的一个之前。 但是相反,它们以相反的顺序出现。 我要去哪里错了?

您无法在List.forEach()或Map.forEach()中进行async/await ,因为它们都返回void。 无论使用

await Future.forEach([1, 2, 3], (num) async {
    await asyncMethod(num);
  });

或类似的东西; https://api.flutter.dev/flutter/dart-async/Future/forEach.html

forEach通常无法实现您期望的效果,因为提供的函数作为闭包运行。

当你想遍历一个列表做一些每个元素使用它更自然for (或者更多的功能型方法,如一个map )。

目前尚不清楚CatList是什么类型,所以这是一个近似值,但是您会想要更多类似的东西:

Future<List<Cat>> convertToCats(CatList catData) async {
  var cats = <Cat>[];
  for (var i = 0; i < catData.length; i++) {
    var key = catData[i].key;
    var pos = await calculatePos();
    print('This should come first');
    cats.add(Cat(name: key, pos: pos));
  }
  return cats;
}

要么

Future<List<Cat>> convertToCats(CatList catData) async {
  return catData.map(...some mapping function...).toList();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM