如何使用Flutter webview评估Javascript?

Nic*_*ick 4 javascript webview flutter

我尝试使用webview evaluateJavascript并出现错误。WebView Controller有2个功能;evaluateJavascript, 和loadUrl。我在 中测试了两者onPageFinished: (url){},因此我可以初始化我的 javascript 代码。文档不清楚。但该错误告诉我缺少一些 pr 未在 webview 插件中实现的内容。我正在尝试加载页面并初始化一些基本的 javascript,以便我可以隐藏页面的某些部分。

\n\n

如何使用Flutter webview评估Javascript?

\n\n

错误:

\n\n
Syncing files to device iPhone X...\nflutter: Page finished loading: https://stackoverflow.com/\n[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: PlatformException(evaluateJavaScript_failed, Failed evaluating JavaScript, JavaScript string was: \'javascript:(function() { var head = document.getElementsByClassName(\'top-bar js-top-bar top-bar__network _fixed\')[0].style.display=\'none\'; })()\'\nError Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=TypeError: undefined is not an object (evaluating \'document.getElementsByClassName(\'top-bar js-top-bar top-bar__network _fixed\')[0].style\'), WKJavaScriptExceptionColumnNumber=117, WKJavaScriptExceptionSourceURL=https://stackoverflow.com/, NSLocalizedDescription=A JavaScript exception occurred})\n#0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:564:7)\n#1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:302:33)\n<asynchronous suspension>\n#2      WebViewController.evaluateJavascript (package:web<\xe2\x80\xa6>\nApplication finished.\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码:

\n\n
    class _WebViewExampleState extends State<WebViewExample> {\n    WebViewController _myController;\n      bool _loadedPage = false;\n\n      @override\n      void initState() {\n        // TODO: implement initState\n        super.initState();\n        setState(() {\n          _loadedPage = false;\n        });\n      }\n\n\n      @override\n      Widget build(BuildContext context) {\n        return Scaffold(\n          appBar: AppBar(\n            backgroundColor: Colors.green,\n            title: const Text(\n              \xe2\x80\x99Stackoverflow\xe2\x80\x99,\n              style: TextStyle(fontSize: 14),\n            ),\n\n          ),\n          body: Builder(builder: (BuildContext context) {\n            return new Stack(\n              children: <Widget>[\n                new WebView(\n                  initialUrl: \'https://stackoverflow.com\',\n                  javascriptMode: JavascriptMode.unrestricted,\n                  onWebViewCreated: (controller){\n                    _myController = controller;\n                  },\n                  javascriptChannels: <JavascriptChannel>[\n                    _toasterJavascriptChannel(context),\n                  ].toSet(),\n                  onPageFinished: (url){\n                    print(\'Page finished loading: $url\');\n\n                    _myController.evaluateJavascript("javascript:(function() { " +\n                        "var head = document.getElementsByClassName(\'top-bar js-top-bar top-bar__network _fixed\')[0].style.display=\'none\'; " +\n                        "})()");\n\n/*\n                _myController.loadUrl("javascript:(function() { " +\n                    "var head = document.getElementsByClassName(\'top-bar js-top-bar top-bar__network _fixed\')[0].style.display=\'none\'; " +\n                    "})()");\n*/\n\n                    setState(() {\n                      _loadedPage = true;\n                    });\n                  },\n                ),\n                _loadedPage == false\n                    ? new Center(\n                        child: new CircularProgressIndicator(\n                            backgroundColor: Colors.green),\n                      )\n                    : new Container(),\n              ],\n            );\n          }),\n\n        );\n      }\n\n      JavascriptChannel _toasterJavascriptChannel(BuildContext context) {\n        return JavascriptChannel(\n            name: \'Toaster\',\n            onMessageReceived: (JavascriptMessage message) {\n              Scaffold.of(context).showSnackBar(\n                SnackBar(content: Text(message.message)),\n              );\n            });\n      }\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Joe*_*Chu 7

所有答案现在都已过时,并且evaluateJavascript不再存在于包中。现在调用runJavascript;如果您不需要从 javascript 返回值,则使用runJavascriptReturningResult.

你可以在这里看到一个例子