如何在Flutter WebView中通过Asset Links唤起第三方原生App?
在Flutter WebView中唤起已配置App Link的原生App
你遇到的component name is null错误,是因为url_launcher默认无法直接通过HTTPS URL解析到App Link对应的原生App组件——App Link的匹配逻辑是由Android系统负责的,而非插件直接处理。以下是几种可行的解决方案:
方案1:使用android_intent_plus发送系统VIEW Intent
Android的App Link是通过ACTION_VIEW Intent触发的,直接调用系统Intent可以让系统自动匹配对应的原生App:
- 添加依赖到
pubspec.yaml:
dependencies: android_intent_plus: ^4.0.0 # 替换为最新版本
- 修改WebView的
onNavigationRequest逻辑:
import 'package:android_intent_plus/android_intent.dart'; import 'package:webview_flutter/webview_flutter.dart'; // ... WebView( initialUrl: "your_initial_url", navigationDelegate: (navigation) async { if (navigation.url.startsWith('https://www.bank.com')) { final intent = AndroidIntent( action: 'android.intent.action.VIEW', data: navigation.url, ); await intent.launch(); return NavigationDecision.prevent; } return NavigationDecision.navigate; }, )
方案2:调整url_launcher的调用方式
通过指定LaunchMode.externalApplication,让Android系统负责链接的解析和处理,而非插件自行查找组件:
- 确保
url_launcher依赖已添加,然后修改代码:
import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; // ... WebView( initialUrl: "your_initial_url", navigationDelegate: (navigation) async { if (navigation.url.startsWith('https://www.bank.com')) { final uri = Uri.parse(navigation.url); if (await canLaunchUrl(uri)) { // 让系统处理链接,触发App Link匹配 await launchUrl(uri, mode: LaunchMode.externalApplication); } return NavigationDecision.prevent; } return NavigationDecision.navigate; }, )
- 针对Android 11+,需要在
android/app/src/main/AndroidManifest.xml中添加查询声明,允许App访问目标链接的Intent:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" android:host="www.bank.com" /> </intent> </queries>
关键注意事项
- 确认目标银行App已正确配置App Link:
https://www.bank.com/.well-known/assetlinks.json文件存在且格式正确,App的Manifest中包含对应的<intent-filter>并设置了android:autoVerify="true"。 - Debug模式下,需在设备开发者选项中开启App Links verification settings的允许调试选项,否则系统可能跳过本地验证。
内容的提问来源于stack exchange,提问作者Erik Pragt
相关产品推荐
相关产品推荐

