Flutter使用url_launcher打开WebView后Android端无法返回App问题咨询
结论
你遇到的Android端无返回按钮的问题无法通过你当前的url_launcher参数配置解决,但可以通过调整url_launcher的启动模式,或者切换到webview_flutter实现需求,两种方案都满足应用内打开链接、不跳外部浏览器的要求。
原因说明
你当前代码中设置的forceWebView: true,在Android端会触发url_launcher内置的极简WebView实现,这个实现仅提供基础网页渲染能力,没有内置导航栏、返回按钮这类UI组件,也不支持自定义新增导航控件,所以用户没有返回应用的入口。
另外你目前使用的launch方法、forceSafariVC、forceWebView等参数在url_launcher v6.0.0及以上版本已经被官方废弃,建议优先升级到最新版本适配。
可行方案
方案1:调整url_launcher启动模式(改造成本最低)
升级到最新版url_launcher后,使用launchUrl方法,将启动模式设置为LaunchMode.inAppWebView,Android端会自动使用系统Custom Tabs能力打开链接,自带系统顶部导航栏和返回按钮,用户点击即可返回应用,同时默认开启JavaScript支持,完全适配3DS验证需求。
示例代码:
Future<void> _launchInApp(String url) async { final Uri uri = Uri.parse(url); if (await canLaunchUrl(uri)) { await launchUrl( uri, mode: LaunchMode.inAppWebView, ); } else { throw 'Could not launch $url'; } }
如果暂时不想升级url_launcher版本,可以把原有代码中的forceWebView: true改为forceWebView: false,Android端同样会唤起Custom Tabs获得返回按钮能力。
注意:部分国内定制ROM对Custom Tabs兼容性较差,如果遇到无法正常打开链接的问题,建议使用方案2。
方案2:使用webview_flutter自定义实现(灵活性最高)
如果需要自定义导航栏样式、隐藏地址栏、或者监听3DS验证完成的回调自动跳转到订单确认页,可以直接改用webview_flutter实现内置浏览器:
- 新建一个独立的WebView页面,顶部自行添加导航栏和返回按钮,点击按钮即可关闭页面回到应用
- 可以监听WebView的页面跳转事件,检测到3DS验证完成的回调地址时,自动关闭WebView并跳转到订单确认页,用户体验更流畅
内容的提问来源于stack exchange,提问作者wax_boi

