Flutter web 如何在运行flatter的本机和本机web视图之间进行通信';s的web应用程序?

Flutter web 如何在运行flatter的本机和本机web视图之间进行通信';s的web应用程序?,flutter-web,Flutter Web,Android允许指定Javascript接口作为webview和Android代码之间的桥梁。类似地,iOS提供UiWebView stringByEvaluatingJavaScriptFromString方法,该方法允许与底层webview通信 但问题是,一旦我们构建了Flitter web应用程序,并说我们将其作为android中web视图的一部分,那么每当需要进行通信时,我们都应该在android端和javascript端手动编写一些代码 由于编辑从Flatter web app bu

Android允许指定Javascript接口作为webview和Android代码之间的桥梁。类似地,iOS提供UiWebView stringByEvaluatingJavaScriptFromString方法,该方法允许与底层webview通信

但问题是,一旦我们构建了Flitter web应用程序,并说我们将其作为android中web视图的一部分,那么每当需要进行通信时,我们都应该在android端和javascript端手动编写一些代码

由于编辑从Flatter web app build生成的javascript代码是不切实际的,因此我们需要一种在Flatter端建立通信通道的方法,该通道将使用上述相同类型的javascript桥与本机端进行通信。这将类似于在本机端直接使用颤振应用程序时的方法通道


那么,我们如何从flatter内部注入或添加自定义javascript代码,以便在编译js文件时添加它呢?

您可以在android端创建一个webmessage频道(iOS有一个等效的)

这里有一个关于如何操作的说明:

javascript端的简短设置如下所示-您需要在dart html中实现:

const channel = new MessageChannel();
var nativeJsPortOne = channel.port1;
var nativeJsPortTwo = channel.port2;
window.addEventListener('message', function(event) {
    if (event.data != 'capturePort') {
        nativeJsPortOne.postMessage(event.data)
    } else if (event.data == 'capturePort') {
        /* The following three lines form Android class 'WebViewCallBackDemo' capture the port and assign it to nativeJsPortTwo
        var destPort = arrayOf(nativeToJsPorts[1])
        nativeToJsPorts[0].setWebMessageCallback(nativeToJs!!)
        WebViewCompat.postWebMessage(webView, WebMessageCompat("capturePort", destPort), Uri.EMPTY) */
        if (event.ports[0] != null) {
            nativeJsPortTwo = event.ports[0]
        }
    }
}, false);

nativeJsPortOne.addEventListener('message', function(event) {
    alert(event.data);
}, false);

nativeJsPortTwo.addEventListener('message', function(event) {
    alert(event.data);
}, false);
nativeJsPortOne.start();
nativeJsPortTwo.start();
在颤振web窗口上使用eventlistener进行监听的类似解决方案如下:

    window.onMessage.listen((onData) {
  print(onData.toString());

  MessageEvent messageEvent = onData;

  for (Property property in properties) {
    if (messageEvent.data["id"] == property.id) {

          });
    } else if (messageEvent.data["northEastLng"] != null) {
      print(messageEvent.data["northEastLat"]);

      if (double.parse(messageEvent.data["northEastLat"]) == bounds.northEast.lat && double.parse(messageEvent.data["northEastLng"]) == bounds.northEast.lng){
        return;
      }

      LatLng southWest = new LatLng(double.parse(messageEvent.data["southWestLat"]), double.parse(messageEvent.data["southWestLng"]));
      LatLng northEast = new LatLng(double.parse(messageEvent.data["northEastLat"]), double.parse(messageEvent.data["northEastLng"]));
      LatLngBounds incomingBounds = new LatLngBounds(southWest, northEast);
      if (incomingBounds == bounds) {
        return;
      }
      bounds = incomingBounds;
      _propertyListPresenter.filterBounds(bounds);
    }
  }
});

您可以在android端创建一个webmessage频道(iOS有一个等效的)

这里有一个关于如何操作的说明:

javascript端的简短设置如下所示-您需要在dart html中实现:

const channel = new MessageChannel();
var nativeJsPortOne = channel.port1;
var nativeJsPortTwo = channel.port2;
window.addEventListener('message', function(event) {
    if (event.data != 'capturePort') {
        nativeJsPortOne.postMessage(event.data)
    } else if (event.data == 'capturePort') {
        /* The following three lines form Android class 'WebViewCallBackDemo' capture the port and assign it to nativeJsPortTwo
        var destPort = arrayOf(nativeToJsPorts[1])
        nativeToJsPorts[0].setWebMessageCallback(nativeToJs!!)
        WebViewCompat.postWebMessage(webView, WebMessageCompat("capturePort", destPort), Uri.EMPTY) */
        if (event.ports[0] != null) {
            nativeJsPortTwo = event.ports[0]
        }
    }
}, false);

nativeJsPortOne.addEventListener('message', function(event) {
    alert(event.data);
}, false);

nativeJsPortTwo.addEventListener('message', function(event) {
    alert(event.data);
}, false);
nativeJsPortOne.start();
nativeJsPortTwo.start();
在颤振web窗口上使用eventlistener进行监听的类似解决方案如下:

    window.onMessage.listen((onData) {
  print(onData.toString());

  MessageEvent messageEvent = onData;

  for (Property property in properties) {
    if (messageEvent.data["id"] == property.id) {

          });
    } else if (messageEvent.data["northEastLng"] != null) {
      print(messageEvent.data["northEastLat"]);

      if (double.parse(messageEvent.data["northEastLat"]) == bounds.northEast.lat && double.parse(messageEvent.data["northEastLng"]) == bounds.northEast.lng){
        return;
      }

      LatLng southWest = new LatLng(double.parse(messageEvent.data["southWestLat"]), double.parse(messageEvent.data["southWestLng"]));
      LatLng northEast = new LatLng(double.parse(messageEvent.data["northEastLat"]), double.parse(messageEvent.data["northEastLng"]));
      LatLngBounds incomingBounds = new LatLngBounds(southWest, northEast);
      if (incomingBounds == bounds) {
        return;
      }
      bounds = incomingBounds;
      _propertyListPresenter.filterBounds(bounds);
    }
  }
});

你看过吗?或者?@tomerpacific这些文章是关于在flifter应用程序中嵌入web视图的。我想问的是,在运行Flitter应用程序的本机Android中使用web视图。为什么您希望Android应用程序在web视图中运行Flitter应用程序?这似乎是一个相当复杂的场景。你看到了吗?或者?@tomerpacific这些文章是关于在flifter应用程序中嵌入web视图的。我想问的是,在运行Flitter应用程序的本机Android中使用web视图。为什么您希望Android应用程序在web视图中运行Flitter应用程序?这似乎是一个相当复杂的场景。