【问题标题】:Logout from a webview to flutter从 web 视图中注销以颤振
【发布时间】:2020-10-02 05:22:15
【问题描述】:

I/chromium( 4243): [INFO:CONSOLE(34)] "Uncaught TypeError: JSReceiver.Disconnect is not a function", source: https://myUrl......

我正在使用带有 Flutter 的 webview,我想与 webview 中的函数 javascript 进行交互并将其发送到 flutter。换句话说,我想与 webview 断开连接。

在我的网络视图中我正在使用

<div class="menuopt" onclick="JSReceiver.Disconnect();">Logout</div>

到目前为止我在 Flutter 中所做的尝试:

WebView(
                      initialUrl:
                          'https://www.url/insert.html?token=$token&id_user=$id',
                      javascriptMode: JavascriptMode.unrestricted,
                      onWebViewCreated: (WebViewController webViewController) {
                        _controler.complete(webViewController);
                      },
                      javascriptChannels: Set.from([
                        JavascriptChannel(
                            name: 'JSReceiver',
                            onMessageReceived: (JavascriptMessage message) {
                              Disconect(){
                              sharedPreferences.clear();
                              Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => LoginPage()), (Route<dynamic> route) => false);
                              print("disconnect");
                            }}
                            )
                      ]),

                    );

【问题讨论】:

  • 您好,您使用的是哪个网页视图插件?您能否详细说明您的代码的行为以及期望的行为是什么?
  • 他我正在使用 webview flutter "package:webview_flutter/webview_flutter.dart"。我希望我的功能将我转发到登录页面。但相反,这是我在我的 web 视图中单击注销按钮后得到的:I/chromium(4243): [INFO:CONSOLE(34)] "Uncaught TypeError: JSReceiver.Disconnect is not a function",来源:https:/ /

标签: api rest flutter dart webview


【解决方案1】:

尽管我不清楚Disconnect(){...} 的语法,但我认为正确的实现应该是这样的:

WebView(
  initialUrl:
      'https://www.url/insert.html?token=$token&id_user=$id',
  javascriptMode: JavascriptMode.unrestricted,
  onWebViewCreated: (WebViewController webViewController) {
    _controler.complete(webViewController);
  },
  javascriptChannels: Set.from(
    [
      JavascriptChannel(
          name: 'JSReceiver',
          onMessageReceived: (JavascriptMessage message) {
            if (message == "disconnect"){
            sharedPreferences.clear();
            Navigator.of(context).pushAndRemoveUntil(
              MaterialPageRoute(builder: (BuildContext context) => LoginPage()), 
              (Route<dynamic> route) => false,
            );
            print("disconnect");
          }
        }
      )
    ],
  ),
);

并且,在 JavaScript 方面,你可以这样做:

JsReceiver.postMessage('disconnect');

虽然我从未使用过webview_flutter(我使用过flutter_webview_plugin)并且没有明确的文档,但我的回答是基于:

希望这会有所帮助!

【讨论】:

  • 您好,感谢您的回复。不幸的是,我无法在 web 视图中更改 JavaScript 代码。至于插件,请告诉我 flutter_webview_plugin 是否是更好的选择。它仍然无法识别 javascript "" 上的功能
  • 很遗憾,您需要更改 JavaScript 代码,因为 JSReceiver 是一个通道,并且该通道具有标准方法 postMessage,而 Disconnect 不是通道对象的方法。据我所知,这就是 js 频道的工作方式。而且,关于更好的选择,我无法回答,因为我没有使用 webview_flutter 的经验。显然,这些团队正在一起工作,并且具有相似的功能,所以我会坚持使用你知道的那个!
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多