如何在 flutter iOS Native 代码中使用多个 EventChannel (Swift)

Zak*_*han 6 swift flutter

您好,我正在尝试使用多个事件通道将数据从本机端流式传输到 iOS swift 端,当我调用下面的设置处理程序时,我们只得到一个回调,我想要某种方法来区分我得到的事件接收器是针对哪个事件接收器的事件通道 1 或事件通道 2

let EventChannel1 = FlutterEventChannel(name: "stream1",binaryMessenger: controller.binaryMessenger)
let EventChannel2 = FlutterEventChannel(name: "stream2",binaryMessenger: controller.binaryMessenger)

EventChannel1.setStreamHandler(self)
EventChannel2.setStreamHandler(self)
Run Code Online (Sandbox Code Playgroud)

然后相关的回调我们得到这个

  func onListen(withArguments arguments: Any?,
                     eventSink: @escaping FlutterEventSink) -> FlutterError? {
    debugPrint("On Listen Call")
    EventSink = eventSink//this is for the old event channel now I am using 
    //two event channel.
    //and don't know how to know which event channel is which. on flutter 
    //app startup I listen both stream.
    //and the "on Listen Call" which I print to console print two times 
    //which indicate the I am listen to both stream. 
    //but here I don't know how I know if the eventsink is for which event channel.
    //I want some condition here but don,t know how to implement. if possible 
    //something like this if eventchanel.name == eventchannel1 
    //so that I know which event channel event sink it is and handle it according.
    return nil
 }

  func onCancel(withArguments arguments: Any?) -> FlutterError? {
    debugPrint("On cancel Call")
    EventSink = nil
    return nil
 }
Run Code Online (Sandbox Code Playgroud)

如果问题不清楚,请告诉我,以便我可以更清楚地解释。

Zak*_*han 7

我在查看 GitHub flutter 事件通道示例并尝试不同的事情时喜欢这个问题。检查下面的代码,我添加了注释,以便遇到相同问题的人可以轻松解决它。

let EventChannel1 = FlutterEventChannel(name: "stream1",binaryMessenger: controller.binaryMessenger)
let EventChannel2 = FlutterEventChannel(name: "stream2",binaryMessenger: controller.binaryMessenger)

EventChannel1.setStreamHandler(self)
EventChannel2.setStreamHandler(self)

func onListen(withArguments arguments: Any?,
                     eventSink: @escaping FlutterEventSink) -> FlutterError? {
    debugPrint("On Listen Call")
    //you see the arguments above this are the one which we can use to know which event channel it is.
    EventSink = eventSink
    return nil
 }

  func onCancel(withArguments arguments: Any?) -> FlutterError? {
    debugPrint("On cancel Call")
    EventSink = nil
    return nil
 }
Run Code Online (Sandbox Code Playgroud)

当您在 flutter 端监听此流时,您可以在那里传递参数。检查下面的代码。(颤振端代码)

static const EventChannel1 = const EventChannel("stream1")
static const EventChannel2 = const EventChannel("stream2")

EventChannel1.receiveBroadcastStream(parameter1).listen(_handlestream1);
//here instead of parameter you can pass integer or string 

EventChannel2.receiveBroadcastStream(parameter2).listen(_handlestream2);
////here instead of parameter you can pass integer or string and that can be use in on listen to check which event channel it is.
Run Code Online (Sandbox Code Playgroud)

那么 Swift 本机代码将如下所示。

let EventChannel1 = FlutterEventChannel(name: "stream1",binaryMessenger: controller.binaryMessenger)
let EventChannel2 = FlutterEventChannel(name: "stream2",binaryMessenger: controller.binaryMessenger)

EventChannel1.setStreamHandler(self)
EventChannel2.setStreamHandler(self)

func onListen(withArguments arguments: Any?,
                     eventSink: @escaping FlutterEventSink) -> FlutterError? {
    debugPrint("On Listen Call")

    //here we will check the argument we pass will listen to this eventstream.
    if arguments as? Int == parameter1 { 
        // here you unwrap the argument and check it with parameter you pass
        //if this check pass its mean that its is event channel1 and handle that here
        Evensink1 = eventSink 
    }

    if arguments as? Int == parameter2 {
        //if this check pass mean eventchannel2 and handle that here
        EventSink = eventSink
    }

    return nil
 }

  func onCancel(withArguments arguments: Any?) -> FlutterError? {
    debugPrint("On cancel Call")
    EventSink = nil
    return nil
 }
Run Code Online (Sandbox Code Playgroud)

如果您需要任何进一步的帮助,请告诉我,我随时为您提供帮助。