Как вернуть данные после завершения асинхронной функции - PullRequest
1 голос
/ 25 апреля 2020

Допустим, у меня есть следующая структура папок:

People
|
|── John
|   |── img.png
|   |── info.json 
|── Craig
|   |── img.png
|   |── info.json
|── Daniel
|   |── img.png
|   |── info.json

Я хотел бы получить info.json каждой папки, указанной в папке People. Для этого я написал функцию:

import 'dart:convert';
import "dart:io";


Directory folderPath = Directory("/storage/people/");
Future<List> getData() async {

      List data = [];

      folderPath.list().listen((e) async { //for every entity in directory
        var path = e.path;
        File infoFile = File("$path/info.json");
        String infoString = await infoFile.readAsString();
        Map info = jsonDecode(infoString);
        data.add(item);
       });
       return data;
  } 

К сожалению, она не работает. Функция не ожидает окончания работы l oop и возвращает data как пустое.

Есть ли способ, чтобы функция возвращала данные после завершения l oop?

Ответы [ 2 ]

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

Можете ли вы попробовать это;

Directory folderPath = Directory("/storage/people/");
Future<List> getData() async {
  List data = [];
  List<FileSystemEntity> entities = folderPath.listSync();

  for (FileSystemEntity e in entities) {
    var path = e.path;
    File infoFile = File("$path/info.json");
    String infoString = await infoFile.readAsString();
    Map info = json.decode(infoString);
    data.add(info);
  }
  return data;
}
0 голосов
/ 25 апреля 2020

Вместо этого вы должны попытаться использовать нативный for-l oop в папкеPath.list (). В Dart использование for для l oop автоматически скажет функции дождаться ее окончания, прежде чем что-либо возвращать.

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