#flutter #flutter-dependencies
#flutter #flutter-зависимости
Вопрос:
Я реализовал WebView в flutter, но он не открывает мой веб-сайт php, который находится на сервере, что я делаю неправильно.
Я новичок в flutter и попробовал webview интегрировать веб-страницу моего веб-сайта в свое приложение, но безуспешно.
Widget build(BuildContext context) {
// TODO: implement build
return WebviewScaffold(
appBar: AppBar(iconTheme:IconThemeData(color: Colors.white),title: Text("Intake Form",style:new TextStyle(color: Colors.white,fontWeight: FontWeight.bold)),backgroundColor:Colors.indigoAccent,automaticallyImplyLeading: false),
url: url,
//url: "http://xxxxxxxx/",
withJavascript: true,
supportMultipleWindows: true,
withLocalStorage: true,
allowFileURLs: true,
enableAppScheme: true,
appCacheEnabled: true,
hidden: false,
scrollBar: true,
geolocationEnabled: false,
clearCookies: true,
// usesCleartextTraffic="true"
);
}
Я ожидаю, что на выходе будет запущен webview, но выдается ошибка.
Ответ №1:
В главном каталоге вашего проекта Flutter у вас есть три основные папки:
- lib = your Dart code
- ios = generated structure for iOS platform
- android = generated structure for Android platform
Нас интересует android
каталог.
Когда вы откроете его, вы увидите «типичную структуру приложения для Android».
Итак, вам нужно сделать 2 вещи:
1) Добавить новый файл в res
Перейдите в каталог:
my_flutter_project/android/app/src/main/res/
Создайте xml
каталог (в res
!)
И внутри xml
добавить новый файл с именем: network_security_config.xml
и содержимым:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
network_security_config.xml
должно быть расположено в path:
my_flutter_project/android/app/src/main/res/xml/network_security_config.xml
Здесь вы можете найти более подробную информацию об этом файле:
https://developer.android.com/training/articles/security-config
2) Изменить AndroidManifest.xml
Перейдите к:
flutter_project/android/app/src/main/AndroidManifest.xml
AndroidManifest.xml
это XML-файл со структурой:
<manifest>
<application>
<activity>
...
</activity>
<meta-data >
</application>
</manifest>
Итак, для <application>
СВОЙСТВ вам нужно добавить 1 строку:
android:networkSecurityConfig="@xml/network_security_config"
Помните, что вы должны добавить его как свойство (внутри application
открывающего тега):
<application
SOMEWHERE HERE IS OK
>
Не как тег:
<application> <--- opening tag
HERE IS WRONG!!!!
<application/> <--- closing tag
Комментарии:
1. Какой замечательный ответ, где каждый шаг объяснен с полной ясностью!
2. Я не могу понять, почему topic starter не принял этот ответ. Это действительно работает! Спасибо, и примите мой голос
3. Ответ правильный, вот мое восприятие в соответствии с вопросом, заключается в том, что когда разработчик внедряет сайт с http: //, тогда этот файл безопасности необходим, иначе, если вы просто измените URL-адрес на https: //, вы не получите никакой ошибки в веб-представлении
4. это замечательный пример и объясняет простой и очень легкий метод работы, спасибо.
5. Не забудьте перезапустить приложение, чтобы изменения вступили в силу
Ответ №2:
установите для свойства usesCleartextTraffic значение true в вашем файле AndroidManifest, как показано ниже.
<application
....
android:usesCleartextTraffic="true"
....>
Комментарии:
1. Даже с этой опцией это не работает :/ Мне пришлось запустить
flutter clean
, а затем снова запустить проект2. @lonelLupu Возможно, очистка не требуется. Кажется, что достаточно остановить все приложение и перестроить его. Причина в том, что AndroidManifest не перезагружается при горячей перезагрузке / перезапуске Flutter.
3. Простой и очень легкий рабочий метод.
4. Я лично думаю, что установка этого значения в true противоречит рекомендациям Android, связанным с сетевой безопасностью; developer.android.com/guide/topics/manifest/application-element . С Android 8 это свойство по умолчанию равно false.
Ответ №3:
Android:
В flutter_project/android/app/src/main/AndroidManifest.xml
Добавить
<application
....
android:usesCleartextTraffic="true"
....>
iOS:
В flutter_project/ ios/ Runner/info.plist
Добавить
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Выполнить flutter clean
.Затем запустите приложение.
Ответ №4:
Для ios измените info.plist ./ios/Runner/info.plist
Добавьте следующее:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
и запустите flutter clean
перед повторным запуском приложения
Ответ №5:
- сделать network_security_config.xml файл.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
- добавьте эти две строки в файл манифеста в тег приложения.
Комментарии:
1. Где именно этот файл должен быть размещен?
2. в папке res создайте папку xml, а затем поместите этот XML-файл .
3. Я работаю в flutter, поэтому там нет папки res.
4. Согласно документам: Этот флаг игнорируется на Android 7.0 (уровень API 24) и выше, если присутствует конфигурация сетевой безопасности Android.