了解 Flutter 中的 Future 和 Completer...如何使用控制器从 webview 加载新的 url

Can*_*000 6 asynchronous webview dart flutter

我无法在 flutter Webview 中加载新 URL...我在 flutter Controller中使用then时遇到问题...FutureWebview

在颤动中Webview,我想加载initialUrl,然后以编程方式从该网页检索一些信息...到目前为止一切正常...但后来我希望Webview 自动加载另一个网页...但我不知道如何使用 thecontroller 和 theCompleter 来做到这一点

片段:

WebView(
  initialUrl: 'https://flutter.dev',
  onWebViewCreated: (WebViewController webViewController) {
    _controller.complete(webViewController);
    },
  onPageFinished: (String url) async{
    if (url == 'https://flutter.dev') {
      // *** I retrieve some data, then I want to navigate ***
      _controller!.loadUrl('https://google.com'); // *** ERROR HERE ***
    }
  },
)
Run Code Online (Sandbox Code Playgroud)

我尝试直接使用controller

_controller!.loadUrl('https://google.com');
Run Code Online (Sandbox Code Playgroud)

如果我不使用 aCompleter 而只是分配 a ,它就可以工作controller

_controller = webViewController;
Run Code Online (Sandbox Code Playgroud)

但似乎不是推荐的选择:

我找到了其他使用 a 的示例FutureBuilder,但我并不想构建任何东西

这是完整的代码,以防万一有用:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'dart:async';

void main() {
  runApp(
    const MaterialApp(
      home: WebViewApp(),
    ),
  );
}

class WebViewApp extends StatefulWidget {
  const WebViewApp({super.key});

  @override
  State<WebViewApp> createState() => _WebViewAppState();
}

class _WebViewAppState extends State<WebViewApp> {
  final Completer<WebViewController> _controller = Completer<WebViewController>();
  
  @override Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter WebView'),),
      body: WebView(
        initialUrl: 'https://flutter.dev',
        onWebViewCreated: (WebViewController webViewController) {
          _controller.complete(webViewController);
          },
        onPageFinished: (String url) async{
          if (url == 'https://flutter.dev') {
            // *** I retrieve some data, then I want to navigate ***
            _controller!.loadUrl('https://google.com'); // *** ERROR HERE ***
          }
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Sae*_*bil 3

关于在这种情况下如何使用完成器的主题!

将回调 onPageFinished 替换为以下代码片段并仔细阅读注释

  onPageFinished: (String url) async{
              // add the missing '/' at the end of the url since the url string is 'https://flutter.dev/' 
              // NOT 'https://flutter.dev'
              if (url == 'https://flutter.dev/') {
                // *** I retrieve some data, then I want to navigate ***
                final wvController = await _controller.future;
                await wvController.loadUrl('https://google.com');
                // ***
                // No More ERROR
                // HERE ***)
              }
            },
Run Code Online (Sandbox Code Playgroud)