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

Flutter WebView中使用Completer与Controller加载新URL问题

解决Flutter WebView使用Completer时无法加载新URL的问题

你遇到的问题是因为_controller是Completer<WebViewController>类型,并非WebViewController实例,直接调用loadUrl会报错。正确的做法是通过Completer的future属性获取到实际的控制器实例后再执行导航操作。

修复方案

修改onPageFinished回调中的代码,通过await _controller.future获取WebViewController实例:

onPageFinished: (String url) async {
  if (url == 'https://flutter.dev') {
    // 这里执行你的数据获取逻辑
    final webViewController = await _controller.future;
    webViewController.loadUrl('https://google.com');
  }
},

原理说明

Completer的作用是包装一个异步操作的结果,当onWebViewCreated触发时,我们通过_controller.complete(webViewController)将控制器实例传递给这个Future。要使用控制器,必须先通过await _controller.future获取到这个已完成的实例,而不是直接操作Completer对象本身。

可选方案(直接持有控制器实例)

如果你觉得await的方式不够直观,也可以同时维护一个可选类型的控制器变量,这种方式同样可靠:

class _WebViewAppState extends State<WebViewApp> {
  final Completer<WebViewController> _controller = Completer<WebViewController>();
  WebViewController? _webViewController; // 新增变量
  
  @override Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter WebView'),),
      body: WebView(
        initialUrl: 'https://flutter.dev',
        onWebViewCreated: (WebViewController webViewController) {
          _webViewController = webViewController; // 直接赋值
          _controller.complete(webViewController);
        },
        onPageFinished: (String url) {
          if (url == 'https://flutter.dev') {
            // 执行数据获取逻辑
            _webViewController?.loadUrl('https://google.com');
          }
        },
      ),
    );
  }
}

这种方式既保留了Completer用于其他异步场景,又能在回调中直接使用控制器,无需await。

内容的提问来源于stack exchange,提问作者Canada2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:05:48