Всякий раз, когда я пытаюсь сделать http-вызов примерно через 20 секунд, я получаю в консоли следующую ошибку:
E/flutter ( 8274): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter ( 8274): SocketException: Failed host lookup: 'flutter-project-xxxxx.firebaseio.com' (OS Error: No address associated with hostname, errno = 7)
Эта ошибка возникает для каждого метода и каждого маршрута, который я вызываю через http-пакет приложения.
Я разрабатываю флаттер-приложение для Windows, используя виртуальное устройство AVD из Android Studio.
Версии:
http: ^0.12.0+1
flutter: 1.0
Случаи:
Из дома или в режиме модема с моего телефона: подключение работает нормально на каждой части виртуального устройства
Из моей рабочей сети (за брандмауэром):
Только с Android Web View я могу без проблем просматривать Интернет (я даже могу вызвать тот же URL-адрес, который я использую в коде, и он работает). Я получаю сообщение об ошибке подключения при использовании любого другого приложения (Chrome, Google Play и т. д.) на виртуальном устройстве и, в частности, "SocketException" при тестировании моего приложения.
В чем разница между звонками из этого приложения? Есть ли способ маршрутизировать вызовы моего приложения так же, как и в веб-просмотре?
Спасибо!
Я использую реальное устройство, в моем случае мои мобильные данные не включены, поэтому я просто использую свои мобильные данные, тогда проблема будет решена, поэтому, пожалуйста, проверьте соединение с реальным устройством.
Попробуйте добавить <uses-permission android:name = "android.permission.INTERNET" /> в свой файл AndroidManifest.xml.
Сработало ли это, у меня та же проблема, http-вызовы работают при разработке, но терпят неудачу при производстве.
Добавление разрешение на интернет — это не только решение.
Вы также должны убедиться, что вы в сети, будь то мобильный или эмулятор
Make sure you are online whether it is mobile or emulator
Make sure you have given internet permission in your app's android/app/src/main/AndroidManifest.xml
<uses-permission android:name = "android.permission.INTERNET"/>
Любопытно, что это работает без разрешения интернета в режиме отладки.
Если приложению требуется доступ к состоянию сети, т. е. разрешить приложению доступ к информации о сетях, то также необходимо следующее разрешение. <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> Дополнительные сведения см.: developer.android.com/training/basics/network-ops/подключение
@Choco, как в телефоне
Я узнал, что существует несколько файлов AndroidManifest.xml. По крайней мере, один в /main и еще один в /debug.
В моем случае был включен «Режим полета». Выключил, и все снова заработало (не могу объяснить, что включило)
Существует несколько AndroidManifest.xml, вам нужно различать их. /debug/AndroidManifest.xml — для отладочного приложения (в разработке), а /main/AndroidManifest.xml — для рабочего приложения (APK). Вам необходимо предоставить доступ к обоим файлам.
Я только что потерял одно утро из-за этого ... какого черта будет работать в эмуляторе и даже в режиме отладки на моем личном телефоне, а в промежуточной сборке - нет ?? Я весьма озадачен.
Я добавил <uses-permission android:name = "android.permission.INTERNET" /> в
мой манифест. Затем мне пришлось перезапустить эмулятор, чтобы интернет заработал.
То же самое и здесь: не удалось подключиться к внешнему миру через http, и у меня также была эта запись в файле AndroidManifest.xml. Итак, я перезапустил эмулятор и вуаля, все заработало отлично.
Если вы используете эмулятор, убедитесь, что мобильные данные активны.
это то, что сработало для меня. Пришлось отключить Wi-Fi и полагаться только на данные. У меня уже было <uses-permission android:name = "android.permission.INTERNET" />.
Проблема в основном возникает, когда устройство пытается получить доступ к любым интернет-ресурсам, чтобы исправить, добавьте в файл AndroidManifest.xml по адресу @android/app/src.
Проверьте, подключен ли Wi-Fi или нет. Мой работал после перезапуска Wi-Fi.
Если вы получаете эту ошибку при использовании плагина flutter_socket_io, не забудьте инициализировать сокет, т.е. socketIO.init(); socketIO.connect();, прежде чем пытаться подписаться на него. Я получил ту же ошибку, что и указанная выше, когда я ее пропустил.
Проверьте, включили ли вы автономную работу в настройках gradle. Файл-> Настройки -> Сборка -> Инструменты сборки -> Автономная работа
Если он включен или отмечен, снимите его.
Кроме того, было бы неплохо взглянуть на «Настройки прокси» внутри «Расширенных элементов управления» эмулятора.
У меня это сработало, если я использовал настройку «Без прокси».
Для тех, кто не находит этот экран (Расширенные элементы управления) в новых версиях Android-студия, вам придется перейти к Настройки -> Эмулятор и снимите флажок Запустить в окне инструментов. Затем перезапустите эмулятор.
Убедитесь, что ваше мобильное устройство или эмулятор подключены к Интернету.
Когда я включил Wi-Fi на своем устройстве, он работал нормально.
Пожалуйста, опубликуйте свой ответ этого типа в разделе комментариев, если он содержит код, тогда все в порядке, пожалуйста, убедитесь в будущем.
Перевод: В моем случае на компьютере был интернет, а на эмуляторе - нет. Я настроил соединение на эмуляторе и решил его.
@SkypeMeSM Пожалуйста, не переводите сообщения для автора. Если автор не может выразить свой вклад на английском языке, то он также не может принимать отзывы, обсуждать и реагировать.
@Yunnosch Автор дал правильный ответ. И он также перевел их родной язык на английский, чтобы другой автор мог изучить и решить эти вопросы.
@RahulKushwaha Нет, автор этого поста его не переводил.
Дважды проверьте / убедитесь, что у вас есть
<uses-permission android:name = "android.permission.INTERNET" />
в файле android/app/src/main/AndroidManifest.xml вашего приложения.
Даже после добавления
<uses-permission android:name = "android.permission.INTERNET"/>
в вашем android/app/src/main/AndroidManifest.xml, если вы все еще находите проблемы, тогда
Может быть ошибка с IP-адрес сервера веб-сайта, например:
Server IP address could not be found
Лучше подождать некоторое время и обязательно перезапустить вайфай, у меня сработало.
Убедитесь, что ваш эмулятор или ваше устройство подключены к Интернету. если ваш эмулятор не может подключиться к Интернету, используйте VPN.
Иногда другой Wi-Fi может мешать подключенному Wi-Fi, что также может вызвать эту ошибку. Попробуйте настроить канал подключенного Wi-Fi на автоматический или вдали от других каналов Wi-Fi.
Даже у меня была такая же проблема. Я перезапустил свой эмулятор, и он сработал!
Пожалуйста, дважды проверьте свою формулировку «Даже я…». Для читателей с другим языковым опытом, который читается странно и может быть неправильно истолкован (правда, с некоторым усилием) как нечто неуважительное.
Включив WIFI, он работает для меня, и убедитесь, что вы также добавили разрешение на Интернет в манифест Android, который он также добавил автоматически, но вы должны убедиться. если все еще нет, то аннулируйте кеши и перезапустите, надеюсь, это сработает
У меня была такая же проблема при запуске приложения на эмулятор.
Мой ноутбук был подключен к Интернету через Мобильная точка доступа моего телефона. Но, видимо, эмулятор не смог получить доступ к Интернету.
Позже я переключился на соединение с маршрутизатором Вай-фай, и приложение прошло гладко, как и ожидалось.
Я не уверен, но есть ли какой-то особый доступ?
Подсказка: Попробуйте поискать что-нибудь в эмуляторе, чтобы проверить подключение к Интернету
Перейдите к диспетчеру AVD, затем выберите свой эмулятор, в меню «Действия» щелкните знак выбора вниз, затем выберите «Стереть данные» и перезапустите эмулятор. Меня устраивает.
только этот ответ сработал для меня, очень хорошо и ура
Сначала я обновил свой флаттер и стер данные эмулятора в диспетчере AVD. Это сработало.
если вы используете vscode, вы получите gai_error=0, если http успешно подключен
Вот правильное место для размещения разрешения на доступ в Интернет, потому что было довольно сложно узнать местоположение
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.appName">
<uses-permission android:name = "android.permission.INTERNET" />
запустите команду запуска флаттера на терминале кода cmd или Visual Studio
Для меня это был просто плохой URL-адрес с функцией «Uri.https(...)» во Flutter. Проверьте правильность адреса в вашем браузере
Проблема для меня заключалась в том, что я использовал VPN. У эмулятора не было доступа в Интернет при подключении к VPN на моем компьютере. Это может помочь кому-то.
В моем случае это было из-за того, что мой телефон не был подключен к Интернету.
Просто включите интернет-соединение
Я намеренно отключил свой эмулятор Wi-Fi, чтобы посмотреть, что произойдет (поскольку могут быть случаи, когда интернет недоступен). Ошибка привела меня сюда, но все, что я вижу, это обходные пути, а не обработка ошибок. На самом деле, приложение должно корректно обрабатывать ошибку и не вылетать из-за отсутствия соединения.
До сих пор все, что я сделал, это поймал ошибку, и если код возврата равен -1 (или что-то другое, кроме 200), я знаю, что у меня проблема, и могу заставить приложение реагировать соответствующим образом.
var request = new http.MultipartRequest("POST", uri);
// multipart that takes file
var multipartFile = new http.MultipartFile('file', stream, length,
filename: fileToUpload.path);
// add file to multipart
request.files.add(multipartFile);
// send
try {
var response = await request.send();
print(response.statusCode);
// listen for response
response.stream.transform(utf8.decoder).listen((value) {
print(value);
});
return response.statusCode;
}
catch (e)
{
return -1;
}
Это определенно проблема с Интернетом, как заявляли другие. Ответ @petro и @Tushar Nikam направил меня в правильном направлении. Мой эмулятор был в режиме полета, но я не знаю как; это тот, который я использую в 90% случаев. Я бы посоветовал проверить все, что может блокировать подключение к Интернету.
проверьте свой URL-адрес. В моем случае я использовал неправильный URL-адрес.
Вы должны попробовать следующее:
Попробуйте запустить приложение в режиме отладки, если оно работает нормально и не работает в режиме выпуска, тогда это может быть связано с проблемой разрешений, поэтому добавьте разрешения (INTERNET, ACCESS_NETWORK_STATE) в файле манифеста.
Если не включены, добавьте разрешения:
<uses-permission android:name = "android.permission.INTERNET"/>
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
Если он не работает в режиме отладки, проверьте правильность вашего URL-адреса, нажав в почтальоне. Если он работает в почтальоне, вы должны выполнить свой веб-сервис следующим образом:
Добавьте зависимость в pubspec.yaml:
dependencies:
flutter:
sdk: flutter
http: 0.13.3
После добавления http:0.13.3 нажмите кнопку Pub get. Если он выполнен с кодом 0, это означает, что он успешно добавлен в ваш проект.
в вашем файле дротика импортируйте http.dart:
import 'package:http/http.dart';
Теперь напишите этот код для запуска веб-сервиса:
var url = Uri.parse('some-url-login?username=abc&&password=xyz');
var response = await get(url, headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Methods':
'GET,PUT,POST,DELETE'
});
if (response.statusCode == 200) {
// success
} else if (response.statusCode == 404){
// not found
} else if (response.statusCode == 500){
// server not responding.
} else {
// some other error or might be CORS policy error. you can add your url in CORS policy.
}
Я надеюсь, что это поможет вам. Холод!
Я использую арх линукс.
Linux arch 5.14.7-arch1-1
И флаттер версия
Flutter 2.2.1
Дартс версия
Dart 2.13.1
Редактор кода
1.58.0
В моем случае включение Wi-Fi решило проблему.
Для меня проблема заключалась в том, что у моего эмулятора были отключены сетевые подключения (LTE и Wi-Fi).
В моем случае я открыл эмулятор до того, как подключился к WIFI к системе. Когда сеть (WIFI) подключилась к моей системе, но не смогла подключиться к эмулятору. Эта проблема возникает из-за отсутствия доступа в Интернет к Эмулятор. Я решил эту проблему таким образом.
Решения:
Подключил сетевой доступ к системе, после чего закрыл эмулятор и заново открыл. Установите приложения, запустите приложение и откройте его. Наконец, все API работают нормально.
Просто хотел добавить, что эта ошибка может возникнуть, если ваш телефон подключен к WiFi с брандмауэром ... это может блокировать трафик (в моем случае это было для корпоративной настройки). Не всегда первая мысль, но стоит упомянуть