list - 在 forEach 循环中填充列表之前,我的异步调用正在返回

标签 list file async-await dart flutter

我有一个例程从设备获取文件名列表,然后读取文件以构建列表。但是,调用例程总是返回零项。我打印文件名,所以我知道它们存在,但是,在我读取文件之前,异步似乎正在返回。我在进行 HTTP 调用时使用了类似的代码。但是,这里的某些事情导致例程返回列表,即使它还没有完成。也许,我可能在错误的时间调用它?我在这里调用retrieveItems:

@override
  void initState() {
    super.initState();
    retrieveItems();
  }

最终我会有一个刷新按钮,但现在我只想用文件中的数据填充列表...

--------

被调用者

Future<List<String>> readHeaderData() async {
  List<String> l = new List();
  List<String> files = await readHeaders(); // Gets filenames
  files.forEach((filename) async {
    final file = await File(filename);
    String contents = await file.readAsString();
    User usr = User.fromJson(json.decode(contents));
    String name = usr.NameLast + ", " + usr.NameFirst;
    print(name);
    l.add(name);
  }
  return l;

来电者

void retrieveItems() async {
  LocalStorage storage = new LocalStorage();
  await storage.readHeaderData().then((item) {
      try {
        if ((item != null ) &&(item.length >= 1)) {
          setState(() {
            users.clear();
            _users.addAll(item);
          });
        } else {
          setState(() {
            _users.clear();
            final snackbar = new SnackBar(
              content: new Text('No users found.'),
            );
            scaffoldKey.currentState.showSnackBar(snackbar);
          });
        }
      } on FileNotFoundException catch (e) {
        print(e.toString()); //For debug only
        setState(() {
          _users.clear();
        });
      });
    }
  });

最佳答案

这段代码

Future<List<String>> readHeaderData() async {
  List<String> l = new List();
  List<String> files = await readHeaders(); // Gets filenames
  files.forEach((filename) async {
    final file = await File(filename);
    String contents = await file.readAsString();
    User user = User.fromJson(json.decode(contents));
    String name = user.NameLast + ", " + user.NameFirst;
    print(name);
    l.add(name);
  }
  return l;
}

返回列表 l 然后处理 asyc forEach(...) 回调

如果你改成

Future<List<String>> readHeaderData() async {
  List<String> l = new List();
  List<String> files = await readHeaders(); // Gets filenames
  for(var filename in files) {  /// <<<<==== changed line
    final file = await File(filename);
    String contents = await file.readAsString();
    User user = User.fromJson(json.decode(contents));
    String name = user.NameLast + ", " + user.NameFirst;
    print(name);
    l.add(name);
  }
  return l;
}

在处理完所有文件名之前,该函数不会返回。

files.forEach((filename) async {

表示你可以在回调中使用await,但是forEach并不关心(filename) async {...}是什么> 返回。

关于list - 在 forEach 循环中填充列表之前,我的异步调用正在返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51106934/

相关文章:

javascript - async/await 返回 Promise { <pending> }

c# - 如何在基于异步/等待的单线程协程实现中捕获异常

python - 使用列表列表时出现 TypeError

c++ - 从文本文件中读取,存储数据的最佳方式 C++

list - SWI-Prolog : How to stop the predicate when the list is empty?(包括谓词)

c - 确定描述符是套接字还是 Windows 上的常规文件?

c - fputs 制造问题

javascript - Node 异步库 filterLimit 总是返回 undefined

java - 迭代两个列表并提取一些东西的最佳方法?

c++ - 使用列表 STL 时出错