Dart Future HttpCLientRequest возвращает Null

Класс Requests устанавливает HttpClientRequest. Метод getTeamsJsonForRequest должен возвращать ответ JSON. Однако я полагаю, что переменная return не присваивается должным образом. Печать «CONTS» в ответе .then успешно печатает правильный ответ, но печать разделов «myres» говорит о том, что результат равен нулю. Не уверен, почему результат не назначается в разделе response.transform.

class Requests {
    static Future getTeamsJsonForRequest(String reqPath) async{
        var result;
        HttpClient myhttp = new HttpClient();
        String path = '/api/v3' + reqPath;
        myhttp.get('www.thebluealliance.com', 80, path) 
        .then((HttpClientRequest request) {
            request.headers.set("accept", "application/json");
            request.headers.set("X-TBA-Auth-Key", "XXXXX");
            return request.close();
        })
        .then((HttpClientResponse response) {
             response.transform(utf8.decoder).transform(json.decoder).listen((conts) {
                print('CONTS: ' + conts.toString());
                result = json.decode(conts).toString();
            });
        });
        print('myres: ' + result.toString());
        return result;
        }
    }
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
278
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Краткий ответ: избегайте использования Future.then внутри метода async.

Ваш print запускается до получения ответа. https://www.dartlang.org/tutorials/language/futures#async-await

Без await любая работа, которая выполняется асинхронно, будет выполняться после, последующие операторы в этой функции выполняются.

Вот как бы я это написал:

Future<String> teamsJsonForRequest(String requestPath) async {
  var client = new HttpClient();
  var path = '/api/v3$requestPath';
  var request = (await client.get('www.thebluealliance.com', 80, path))
    ..headers.set("accept", "application/json")
    ..headers.set("X-TBA-Auth-Key", "XXXXX");
  var response = await request.close();
  var result =
      await response.transform(utf8.decoder).transform(json.decoder).single;
  print('myres: $result');
  return result;
}

Другие вопросы по теме