Flutter web - вызов http.get выдает исключение

Это отлично работает на Android / Desktop:

Future<List<City>> fetchCities() async {


  final response =
  await http.get(globals.url + '/city',
      headers: {HttpHeaders.acceptHeader: globals.apiVersion});

  if (response.statusCode == 200) {
    // If the call to the server was successful, parse the JSON
    return compute(parseCities, response.body);
  } else {
    // If that call was not successful, throw an error.
    print('Failed to load cities');
    throw TextException(Strings.msg_session_expired);
  }
}

Но при запуске как веб-приложения получаю исключение:

errors.dart:145 Uncaught (in promise) Error: Unsupported operation: Platform._version
    at Object.throw_ [as throw] (errors.dart:194)
    at Function._version (io_patch.dart:284)
    at Function.get version [as version] (platform_impl.dart:121)
    at get _version (platform.dart:74)
    at Function.desc.get [as _version] (utils.dart:75)
    at Function.get version [as version] (platform.dart:231)
    at Object._getHttpVersion (http_impl.dart:3234)
    at new _http._HttpClient.new (http_impl.dart:2071)
    at Function.new (http.dart:1473)
    at new io_client.IOClient.new (io_client.dart:23)
    at Function.new (client.dart:30)
    at _withClient (http.dart:165)
    at _withClient.next (<anonymous>)
    at runBody (async_patch.dart:84)
    at Object._async [as async] (async_patch.dart:123)
    at Object._withClient (http.dart:164)
    at Object.get (http.dart:47)
    at fetchCities (mcity.dart:113)
    at fetchCities.next (<anonymous>)
    at runBody (async_patch.dart:84)
    at Object._async [as async] (async_patch.dart:123)

Есть ли способ заставить запросы http.get работать с flutter_web?


person user1209216    schedule 14.11.2019    source источник


Ответы (1)


Использование HttpHeaders.acceptHeader могло быть проблемой. Это часть библиотеки dart:io, которая не поддерживает Flutter Web. Вместо этого вам следует попробовать установить заголовки по-другому. Например, на основе этого постоянного значения здесь что-то вроде должно работать.

final response =
  await http.get(globals.url + '/city',
      headers: {"accept": globals.apiVersion});

В другом сообщении я использовал пакет https://pub.dev/packages/http, который показывает, что этот пакет можно использовать для флаттер-сети.

person Abhilash Chandran    schedule 15.11.2019
comment
Это не помогает. Как я вижу, http внутренне использует dart.io и по-прежнему выдает ошибку. Кажется, я не могу использовать какие-либо пользовательские заголовки, иначе это вызовет ошибку. - person user1209216; 18.11.2019
comment
Я удалил все заголовки из своего вызова, но все еще получаю ту же ошибку. Я не понимаю, как у вас это получилось. - person user1209216; 18.11.2019
comment
Можете ли вы включить свои операторы импорта. Вы правы, http пакет использует dart:io, но делает это путем условного импорта. Это означает, что он будет чередоваться между dart:html и dart: io` в зависимости от контекста, в котором он запущен. В вашем снимке исключения я вижу at new io_client.IOClient.new (io_client.dart:23) из пакета http. Он как-то забирает io_client вместо browser_client. Не могли бы вы просто написать, как вы развертываете свой код или запускаете его ... - person Abhilash Chandran; 18.11.2019
comment
Я даже удалил dart.io из импорта. Тем не менее, я получаю сообщение об ошибке. Версия Flutter из мастер-канала. Какую версию вы тестировали? - person user1209216; 18.11.2019
comment
Я полагаю, это последний, потому что я только что обновился до дневного утра. :) Резюме доктора (чтобы увидеть все подробности, запустите flutter doctor -v): [√] Flutter (Мастер каналов, v1.12.3-pre.49, в Microsoft Windows [версия 10.0.17134.1069], locale de-DE) [√ ] Android toolchain - разработка для устройств Android (Android SDK версии 28.0.3) [√] Chrome - разработка для Интернета [√] Android Studio (версия 3.5) [√] VS Code (версия 1.40.1) [√] Подключенное устройство (2 доступно) • Проблем не обнаружено! - person Abhilash Chandran; 18.11.2019
comment
Давайте продолжим это обсуждение в чате. - person Abhilash Chandran; 18.11.2019