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
相关产品推荐
相关产品推荐

