Flutter使用webview_flutter实现匹配URL跳转其他域名的问题
问题解决方案
你原代码的核心问题是直接调用controller.data!.loadUrl()的写法错误,_controller是Completer<WebViewController>类型,需要先拿到异步初始化完成的控制器实例才能调用加载方法。以下是两种可行的实现方案:
方案1:导航请求阶段拦截(推荐)
该方案不需要等待包含aaaa的页面加载完成,直接在请求阶段拦截替换目标地址,性能和体验更优,修改navigationDelegate配置即可:
navigationDelegate: (NavigationRequest request) { // 原有YouTube拦截逻辑保留 if (request.url.startsWith('https://www.youtube.com/')) { print('blocking navigation to $request'); return NavigationDecision.prevent; } // 新增aaaa匹配逻辑 if (request.url.toLowerCase().contains('aaaa')) { // 拿到WebViewController实例后跳转到目标地址 _controller.future.then((webViewController) { webViewController.loadUrl("https://other_domain"); }); // 阻止原请求继续加载 return NavigationDecision.prevent; } print('allowing navigation to $request'); return NavigationDecision.navigate; },
方案2:页面加载完成后跳转(适配原有写法)
如果业务要求必须等原页面加载完成后再跳转,修改你标注的onPageFinished部分代码即可:
onPageFinished: (String url) { print('Page finished loading: $url'); if (url.toLowerCase().contains('aaaa')) { // 异步获取已初始化的控制器实例执行跳转 _controller.future.then((webViewController) { webViewController.loadUrl("https://other_domain"); }); } },
注意事项
- 确保全局声明的
_controller变量名和onWebViewCreated中赋值的变量名完全一致,避免拼写错误 - 通过
_controller.future.then获取的控制器实例已完成初始化,不需要额外加!强制解包,适配空安全要求
内容的提问来源于stack exchange,提问作者Munhun Jeong
相关产品推荐
相关产品推荐

