首页 > 解决方案 > 如何在 Flutter iOS Native 代码(Swift)中使用多个 EventChannel

问题描述

嗨,当我调用以下设置处理程序时,我正在尝试使用多个事件通道将数据从本机端流式传输到 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)

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

  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
 }

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

标签: swiftflutter

解决方案


在查看 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
 }

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

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.

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
 }

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


推荐阅读