You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:09:01