如何在flutter中获取html内容表单flutterWebViewPlugin(webview)

Posted

技术标签:

【中文标题】如何在flutter中获取html内容表单flutterWebViewPlugin(webview)【英文标题】:how to get html content form flutterWebViewPlugin ( webview ) in flutter 【发布时间】:2020-07-17 13:06:24 【问题描述】:

我的问题很简单。如何从 webview 中的加载页面获取 html 数据。数据为 JSON 格式。出于某种原因,我不能在这里对任何获取​​请求使用发布请求,所以我只需要使用 webview 获取数据。如何做到这一点?

flutterWebViewPlugin.onUrlChanged.listen((String url) 
      if (url.contains('/recon?')) 
        print('printing url : $url');
        // need to get data ( html content ) on this url
        flutterWebViewPlugin.close();
        Navigator.of(context).pop(url);
      
    );
);


WebviewScaffold(
                userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0",
                url: myurl,               
              )

【问题讨论】:

这里有任何更新。我仍在寻找解决方案。 【参考方案1】:

我的答案是从 url 获取令牌,而不是从 html content 获取令牌,因为我无法正确提取它并得到错误

[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: FormatException: Unexpected character (at character 1)
<html><head></head><body><pre style="word-wrap: break-word; white-space: pr...
^

所以一开始对我有用的是以下解决方案:

WebView(
          userAgent: "random",
          initialUrl: mainUrl,
          onWebViewCreated: (controller) 
            _controller = controller;
            print(_controller.currentUrl());
          ,
          javascriptMode: JavascriptMode.unrestricted,
          gestureNavigationEnabled: true,
          onPageFinished: (_) 
            _controller.currentUrl().then(
              (url) 
                if (url.contains("recon?")) 
                  var token = url.split('recon?')[1];
                  _prefs.setString('token', token);
                
                if (url.contains("dashboard")) 
                  _controller.clearCache();
                  _controller.loadUrl(mainUrl);
                
              ,
            );
          ,
        ),

在这里,我们获取 url,根据关键字将其拆分,然后存储另一半,即令牌并继续。我能够以flutter_webview_pluginflutter_inappwebview 两种方式做到这一点,它的过程相同,但 URL 的东西只对我有用。提取上下文没有,因此它们没有被标记为答案,而是为帮助我理解这种可能性而投了赞成票。

【讨论】:

_controller 是什么?请建议谢谢。 我明白了,_controller 是什么意思。 WebViewController? _controller; WebView( initialUrl: "$widget.networkURL", javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (controller) _controller = controller; // print(_controller!.currentUrl()); , onPageFinished: (_) _controller!.currentUrl().then((url) if (url.toString().contains('transactionstatus')) String encUtIdData = url.toString().split('transactionstatus/')[1]; Navigator.push( context, MaterialPageRoute( builder: (context) =&gt; UsersTransactionDetailScreen( encUtId: encUtIdData, ), ), ); ); , )【参考方案2】:

您可以使用官方 webview 库来做到这一点:

WebView(
  initialUrl: model.luxtrustUrl,
  onWebViewCreated: (controller) 
    _controller = controller;
  ,
  javascriptMode: JavascriptMode.unrestricted,
  gestureNavigationEnabled: true,
  onPageFinished: (_) 
    readJS();
    model.hideProgress();
  ,
)

void readJS() async
    String html = await _controller.evaluateJavascript("window.document.getElementsByTagName('html')[0].outerHTML;");    
    print(html);

【讨论】:

这对我来说是新的,所以也会尝试这个解决方案并发表评论:) 如何从下面输出数据? &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;pre style="word-wrap: break-word; white-space: pre-wrap;"&gt;"did":null,"token_type":"Bearer","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIi 如何获取当前页面的url? 我在一个包含视频标签的页面上尝试了这个,它给了我带有空'src'属性的视频标签,有什么帮助吗? 必须是认可答案【参考方案3】:

你可以使用我的插件flutter_inappwebview,这是一个 Flutter 插件,允许你添加内联 WebViews 或打开一个应用内浏览器窗口,并且有很多事件、方法和选项来控制 WebViews。

要获取 HTML 数据,您只需在 onLoadStop 事件中使用 var html = await controller.evaluateJavascript(source: "window.document.getElementsByTagName('html')[0].outerHTML;");

这是使用您的userAgent 的示例:

import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

Future main() async 
  WidgetsFlutterBinding.ensureInitialized();
  runApp(new MyApp());


class MyApp extends StatefulWidget 
  @override
  _MyAppState createState() => new _MyAppState();


class _MyAppState extends State<MyApp> 
  InAppWebViewController webView;
  String myurl = "https://github.com/flutter";

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

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

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('InAppWebView Example'),
        ),
        body: Container(
            child: Column(children: <Widget>[
              Expanded(
                  child: InAppWebView(
                    initialUrl: myurl,
                    initialHeaders: ,
                    initialOptions: InAppWebViewGroupOptions(
                      crossPlatform: InAppWebViewOptions(
                        debuggingEnabled: true,
                        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0"
                      ),
                    ),
                    onWebViewCreated: (InAppWebViewController controller) 
                      webView = controller;
                    ,
                    onLoadStart: (InAppWebViewController controller, String url) 

                    ,
                    onLoadStop: (InAppWebViewController controller, String url) async 
                      if (url.contains('/recon?')) 
                        // if JavaScript is enabled, you can use
                        var html = await controller.evaluateJavascript(
                            source: "window.document.getElementsByTagName('html')[0].outerHTML;");

                        log(html);
                      
                    ,
                  ))
            ])),
      ),
    );
  

只需将myurl 变量设置为您的网址。

通过window.document.getElementsByTagName('html')[0].outerHTML;,您将获得所有的 HTML 字符串。相反,如果您只需要正文,则可以使用window.document.body.innerText; 进行更改。

【讨论】:

我现在会尝试这个,因为已经厌倦了搜索解决方案。完成其他任务后将更新结果。谢谢。 我爱你的插件。 ***.com/questions/69238180/…

以上是关于如何在flutter中获取html内容表单flutterWebViewPlugin(webview)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 本地化语言

如何在flutter_svg中使用preCachePicture()

Flutter如何与Native(Android)进行交互

如何在flutter中访问ModelName / ProviderName的数据表单实例

如何将数据记录到 Flutter 控制台?

如何在颤动中显示带有提交按钮和隐藏输入字段的html表单