Flutter:如何在运行 JavaScript 函数并显示 html 后等待 WebView 完成加载?

Posted

技术标签:

【中文标题】Flutter:如何在运行 JavaScript 函数并显示 html 后等待 WebView 完成加载?【英文标题】:Flutter: How to wait for WebView to finish loading after running JavaScript function and display the html? 【发布时间】:2021-07-19 07:44:01 【问题描述】:

我想从我的 headlessWebView 中获取完成加载的网站的 html 代码,但最初,该网站执行了一些 js。

得到我想要的东西的步骤是:

    打开网站, 运行 javascript 函数以在文本字段中填充一些内容并按提交, 等待网站执行js并完成加载, 将 webview 的结果作为 HTML 代码存储在字符串中。

下面是我的代码:

     final GlobalKey webViewKey = GlobalKey();

     InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
     crossPlatform: InAppWebViewOptions(
        useShouldOverrideUrlLoading: true,
        mediaPlaybackRequiresUserGesture: false,
      ),
      android: AndroidInAppWebViewOptions(
        useHybridComposition: true,
      ),
      ios: IOSInAppWebViewOptions(
        allowsInlineMediaPlayback: true,
      ));

      HeadlessInAppWebView headlessWebView;
      String htmlCode = "";

      @override
      void initState() 
      super.initState();

      headlessWebView = new HeadlessInAppWebView(
      initialUrlRequest: URLRequest(URL: 
      Uri.parse("https://example.com/")),
      initialOptions: options,
      /*InAppWebViewGroupOptions(
        crossPlatform: InAppWebViewOptions(),
      ),*/
      shouldOverrideUrlLoading: (controller, navigationAction) async 
        var uri = navigationAction.request;
        headlessWebView.webViewController.loadUrl(urlRequest: uri);
        return NavigationActionPolicy.ALLOW;
      ,
      onWebViewCreated: (controller) 
        print('HeadlessInAppWebView created!');
      ,
      onConsoleMessage: (controller, consoleMessage) 
        print("CONSOLE MESSAGE: " + consoleMessage.message);
      ,
      onLoadStart: (controller, url) async 
        print("onLoadStart $url");
        setState(() 
          this.url = url.toString();
        );
      ,
      onLoadStop: (controller, url) async 
        print("onLoadStop $url");
        String jsscript =
            "javascript:(function()  document.getElementById(\"text_feild\").value ='" +
                "sometext" +
                "';document.getElementById(\"submit\").click();)();";
        await headlessWebView.webViewController
            .evaluateJavascript(source: jsscript);

        var result = await headlessWebView.webViewController.evaluateJavascript(
            source:
                "javascript:document.getElementsByTagName('a')[5].getAttribute('href').outerHTML;");

        log(result.toString());
        htmlCode = result.toString();
    
      ,
      onUpdateVisitedHistory: (controller, url, androidIsReload) 
        print("onUpdateVisitedHistory $url");
        setState(() 
          this.url = url.toString();
        );
      ,
    );

我在日志中收到错误(result.toString());它始终为空。

【问题讨论】:

【参考方案1】:

试试这个以获取我当前使用的字符串中的 HTML,这是我的应用,它工作正常。

onLoadStop:
                  (InAppWebViewController controller, String url) async 
                print("onLoadStop: " + url);
                var html = await controller.evaluateJavascript(
                    source:
                        "window.document.getElementsByTagName('html')[0].outerHTML;");

【讨论】:

以上是关于Flutter:如何在运行 JavaScript 函数并显示 html 后等待 WebView 完成加载?的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter Webview 中运行一些 Javascript 文件,例如 index.js

如何使用 dio 从本地主机:3000 切换到准备在 Flutter 中生产的东西?

如何在运行 Flutter Web 应用程序的本地和本地 webview 之间进行通信?

Flutter(Web)如何监听javascript事件或将javascript数据传递给flutter?

如何使用 flutter_webview 插件在 Flutter 中启用位置?

使用flutter_webview_plugin加载页面后如何在WebView中执行JavaScript代码