Flutter WebView加载HTTP页面不显示?这个方法让你轻松解决

前言

Flutter 项目中,当集成 WebView 并尝试加载 HTTP(非 HTTPS )地址时,可能会遇到页面加载失败,仅显示白屏的问题。

这主要是因为现代移动操作系统出于安全考虑,默认限制了 HTTP 流量的加载。

不过,通过适当的配置,我们可以让应用信任并加载 HTTP 内容。

以下是针对 AndroidiOS 平台的详细解决方案。

Android平台解决方案

第一步:修改 AndroidManifest.xml

首先,你需要在 Android 项目的 AndroidManifest.xml 文件中设置 networkSecurityConfig 属性,以允许应用处理非安全的网络请求。

1、打开 android/app/src/main/AndroidManifest.xml 文件。

2、在 <application> 标签中添加 android:networkSecurityConfig 属性,指向你的网络安全配置文件。

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
</application>

第二步:创建network_security_config.xml

1、在 android/app/src/main/res/xml 目录下(如果目录不存在,则需要创建它)创建一个名为 network_security_config.xml 的文件。

2、在该文件中添加以下内容,以允许应用处理明文流量(HTTP请求):

<?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>

这个配置告诉 Android 系统,你的应用将允许非加密的网络流量(即 HTTP 请求)。

iOS平台解决方案

对于 iOS 平台,你需要在项目的 Info.plist 文件中添加特定的键和值来允许应用加载 HTTP 内容。

第三步:修改Info.plist

1、打开 ios/Runner/Info.plist 文件。

2、添加以下键和值来允许应用加载任意网络内容(包括 HTTP ):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

注意,虽然这种方法可以解决问题,但它会降低应用的安全性,因为它允许加载任何来源的网络内容。

在生产环境中,建议尽可能使用 HTTPS

总结

通过上述步骤,你可以解决 Flutter 项目中 WebView 加载 HTTP 地址时出现的白屏问题。

不过,请记得在发布应用时重新评估这些设置,以确保它们不会对你的应用安全造成威胁。

如果可能的话,最好将你的 Web 服务迁移到 HTTPS ,以提高数据传输的安全性。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现 Flutter WebView 页面自适应高度,可以使用 flutter_webview_plugin 插件。该插件提供了一个 onStateChanged 回调函数,可以监听 WebView 页面的状态改变。当页面加载完成后,可以获取 WebView 页面的高度,并将其应用到 WebView 上,从而实现自适应高度。 以下是一个简单的示例代码,演示如何实现 Flutter WebView 页面自适应高度: ```dart import 'package:flutter/material.dart'; import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; class MyWebView extends StatefulWidget { final String url; MyWebView({required this.url}); @override _MyWebViewState createState() => _MyWebViewState(); } class _MyWebViewState extends State<MyWebView> { double webViewHeight = 100.0; @override Widget build(BuildContext context) { return Scaffold( body: Container( height: webViewHeight, child: WebviewScaffold( url: widget.url, withZoom: false, withJavascript: true, withLocalStorage: true, hidden: true, initialChild: Container( color: Colors.white, child: Center( child: CircularProgressIndicator(), ), ), appBar: AppBar( title: Text('WebView Demo'), ), onStateChanged: (state) { if (state.type == WebViewState.finishLoad) { setState(() { webViewHeight = double.parse(state.height.toString()); }); } }, ), ), ); } } ``` 在上面的代码中,我们定义了一个 MyWebView 类,使用 WebviewScaffold 来渲染 WebView 页面。在 onStateChanged 回调函数中,我们监听 WebView 页面的状态改变,并在页面加载完成后获取 WebView 的高度,并将其应用到 WebView 上。这样,就可以实现 WebView 页面的自适应高度了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我码玄黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值