Flutter:如何从外部应用程序接收消息传递?

时间:2020-08-28 08:36:53

标签: flutter flutter-web

我有一个独立的Android应用程序。然后,我在Flutter中开发了较小的Web应用程序,并将其导出到Web服务器。它作为Android Kotlin中该独立应用程序的一部分加载到WebView中。

Android支持后消息传递,我可以通过渠道将数据直接发送到WebView。我的问题是如何在Flutter Dart代码中(在我的Web应用程序内部)收听这些消息?

这是我在Kotlin Android应用中使用的代码:

private var port: WebMessagePort? = null
    @TargetApi(Build.VERSION_CODES.M)
    private fun initPostMessagePort(){
        val channelsAvailable = webView.createWebMessageChannel()
        port = channelsAvailable.firstOrNull()
        port?.apply {
            setWebMessageCallback(object : WebMessageCallback() {
                override fun onMessage(port: WebMessagePort, message: WebMessage) {
                    //TODO do something with message
                }
            })
        }?:kotlin.run {
            App.log("Port initialization failed - channels not available")
        }
    }

    @TargetApi(Build.VERSION_CODES.M)
    private fun sendMessageToPort(message: String){
        port?.let { p->
            webView.postWebMessage(WebMessage(message, arrayOf(p)), Uri.EMPTY)
        }?:kotlin.run {
            App.log("Port not initialized")
        }
    }

因此,有我的Flutter Web App启动代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await di.init();

  //listen to message from mobile app, then run code below
  runApp(MyApp());
  bloc.dispatch(GetUserProfile());
}

4 个答案:

答案 0 :(得分:3)

使用 dart:html 库,我们可以在flutter web应用与其主机android WebView之间建立通信通道:

import 'dart:html' as html;

//...

    html.window.onMessage.listen((event) {

      // do something with received data
      myController.text = event.data; 

      // return a response
      event.ports[0].postMessage("response data");
    });

Android端对应的Kotlin代码:

    val webView = findViewById<WebView>(R.id.webview)
    val (receiver, sender) = webView.createWebMessageChannel()
    receiver.setWebMessageCallback(object : WebMessagePort.WebMessageCallback() {
        override fun onMessage(port: WebMessagePort, message: WebMessage) {
            Log.i("example", "Received ${message.data}")
        }
    })
    val message = WebMessage("Original message", arrayOf(sender))
    webView.postWebMessage(message, Uri.EMPTY)

答案 1 :(得分:1)

不确定100%是否会有所帮助,请尝试Interactive Webview。 使用didReceiveMessage.listen()方法,您应该能够侦听发送到本机Web视图的消息。

答案 2 :(得分:1)

您应该使用WebSockets(socket.io)进行相互通信。保留一个单独的nodejs实例作为您的套接字服务器,从android向套接字服务器发送套接字请求,然后将其从套接字服务器发送到您的Flutter Web应用

请参阅-https://pub.dev/packages/adhara_socket_io

答案 3 :(得分:0)

您可以使用来自socketIO或firebase的云消息传递服务来接收或发送消息