Flutter WebView无法打开:net::ERR_UNKNOWN_URL_SCHEME问题求助
解决Flutter WebView中net::ERR_UNKNOWN_URL_SCHEME错误
错误原因
当WebView尝试加载非HTTP/HTTPS协议的URL(如intent://、market://等自定义或系统Scheme)时,会触发该错误。Firebase动态链接跳转后可能唤起这类Scheme,而WebView默认不支持处理这类非标准网络协议。
解决方案
通过拦截WebView的导航请求,区分协议类型:对HTTP/HTTPS链接继续用WebView加载,对其他Scheme则调用原生系统能力打开。
步骤1:添加依赖
在pubspec.yaml中添加url_launcher插件,用于处理非HTTP/HTTPS链接的打开:
dependencies: flutter: sdk: flutter webview_flutter: ^4.0.0 # 替换为你使用的插件版本 url_launcher: ^6.1.0
步骤2:修改WebView代码
使用navigationDelegate拦截导航请求,做协议判断和处理:
import 'package:url_launcher/url_launcher.dart'; // ... 你的页面代码 SafeArea( child: Scaffold( appBar: AppBar( backgroundColor: Palette.primary, elevation: 0, title: Text( "Payment Checkout", style: Styles.designText(bold: false, size: 14, color: Palette.light), ), ), body: Padding( padding: const EdgeInsets.all(12.0), child: WebViewPlus( onWebViewCreated: (controller) { // 可选:加载你的Firebase动态链接 // controller.loadUrl("你的Firebase动态链接地址"); }, initialUrl: "https://mesomb.hachther.com/en/web/payment/CM/?widget=253", javascriptMode: JavascriptMode.unrestricted, // 拦截导航请求并处理不同协议 navigationDelegate: (NavigationRequest request) async { final url = request.url; // HTTP/HTTPS协议继续由WebView加载 if (url.startsWith('http://') || url.startsWith('https://')) { return NavigationDecision.navigate; } // 其他协议调用原生能力打开 if (await canLaunchUrl(Uri.parse(url))) { await launchUrl(Uri.parse(url)); } // 阻止WebView加载非标准协议链接 return NavigationDecision.prevent; }, ), ), ), );
步骤3:Android端额外配置(可选)
如果涉及intent://等Android特定Scheme,需在AndroidManifest.xml中添加应用查询权限,确保能唤起其他应用:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <!-- 根据业务需求添加其他Scheme的查询规则 --> </queries>
注意事项
- 验证Firebase动态链接的跳转逻辑,确认目标链接不会触发未处理的特殊Scheme。
- 测试时覆盖所有可能的跳转场景,避免遗漏异常情况。
内容的提问来源于stack exchange,提问作者Baimam Boukar Jean Jacques
相关产品推荐
相关产品推荐

