Flutter使用webview_flutter调试正常 release包WebView显示空白如何解决?
Flutter webview_flutter Release包空白问题解决方案
- Android 9+明文请求限制
Android 9(API level 28)及以上系统默认禁止应用发起http明文请求,调试模式下debug配置默认放开了该限制,release模式则遵循系统默认规则,若你加载的URL为http开头就会触发空白。
解决方法:- 优先将加载的URL改为https协议
- 若必须使用http,在
android/app/src/main/AndroidManifest.xml的<application>标签添加属性:android:usesCleartextTraffic="true"
示例:
<application android:name="io.flutter.app.FlutterApplication" android:label="你的应用名" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true"> - Release打包混淆导致webview相关类被裁剪
Flutter release打包默认开启代码压缩和混淆,若没有配置webview_flutter的保留规则,相关类被移除后会导致WebView无法正常渲染。
解决方法:
- 打开
android/app/proguard-rules.pro文件,添加如下规则:
-keep class io.flutter.plugins.webviewflutter.** {*;}
- 确认
android/app/build.gradle中release构建配置已经关联了混淆规则文件:
android { buildTypes { release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
- Android端WebView未提前初始化
高版本webview_flutter要求Android端提前指定WebView实现类,未初始化的情况下release模式会出现兼容性问题,debug模式下通常会有兼容兜底。
解决方法:
在main.dart的main函数中,runApp之前添加初始化逻辑:
import 'dart:io'; import 'package:webview_flutter/webview_flutter.dart'; void main() { if (Platform.isAndroid) { WebView.platform = SurfaceAndroidWebView(); } runApp(const MyApp()); }
- 网络权限配置位置错误
你添加的INTERNET权限需要放在标签的直接子层级,若误放在 标签内部,release模式下权限不会生效,导致无法加载网络资源。
检查你的AndroidManifest.xml文件,确认权限配置位置正确:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="你的包名"> <!-- 权限放在这里 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application ...> ... </application> </manifest>
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

