Ожидание асин c во флаттере - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь написать клиентское приложение Matrix server с Flutter.

Я запрашиваю группы с сервера, членом которого является пользователь.

Future<List> joinedRooms(String accessToken) async {
  String url = server + "/_matrix/client/r0/joined_rooms";
  Map<String, String> headers = {"Authorization": "Bearer $accessToken"};
  Response response = await get(url, headers: headers);
  JoinedRooms roomsID = JoinedRooms.fromJson(jsonDecode(response.body));

  List names = [];

  roomsID.joinedRooms.forEach((roomID) async {
    await roomState(accessToken, roomID).then((value) async {
      await names.add(value[6].content.name);
    });

  return names;
  });

Приходят следующие значения для response.body

{
  "joined_rooms": [
    "!JSHWMPAgoJdkQvRQrr:example.com",
    "!WzjRnPpUASluIsGTuo: example.com"
  ]
}

С помощью метода .forEach я хочу запросить имя группы для каждого идентификатора группы и добавить его в список names.

Future<List<RoomState>> roomState(String accessToken, String roomID) async {
  String url = server + "/_matrix/client/r0/rooms/$roomID/state";
  Map<String, String> headers = {"Authorization": "Bearer $accessToken"};
  Response response = await get(url, headers: headers);
  List<RoomState> states = (json.decode(response.body) as List).map((i) => RoomState.fromJson(i)).toList();
  return states;
}

Список names всегда пуст. async не ждет фрагмента кода. Я перепробовал много методов, но мне это не удалось.

1 Ответ

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

Вы не ожидаете функцию, которая выполняется в forEach

roomsID.joinedRooms.forEach((roomID) async {
  await ...
});

Ожидание не работает, потому что нет ничего, что говорит функции внутри forEach, чтобы ждать. Попробуйте приведенный ниже пример на DartPad

import 'dart:async';

void main() async {

  List<int> list = [1, 2, 3];

  list.forEach((value) async {
    await Future.delayed(Duration(seconds: value));
    print('Waited $value');
  });

  print('Finished main');

}

Результат:

Finished main
Waited 1
Waited 2
Waited 3

Поскольку forEach не ждет функции внутри.

Попробуйте вместо:

for(.. in ..) {
    await ...
}
...