flutter-channel的使用

flutter與flutter plugin之間通過(guò)PlatformChannel進(jìn)行通信,之前我們介紹過(guò)的flutter plugin都是使用了MethodChannel,除此之外,還有BasicMessageChannel和EventChannel.

  • BasicMessageChannel:用來(lái)傳遞字符串和半結(jié)構(gòu)化信息(json)
  • MethodChannel: 用來(lái)傳遞方法調(diào)用
  • EventChannel:用于數(shù)據(jù)流通信 (native->flutter)

BasicMessageChannel的使用

flutter中調(diào)用

BasicMessageChannel _basicChannel =
                              BasicMessageChannel(
                                  "basic_channel", StandardMessageCodec());
                          String result = await _basicChannel.send({"a":1}) as String;
                          TKToast.show("返回來(lái)了--$result");

Android,在MainActivity中(kotlin)

class MainActivity: FlutterActivity() {
 override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
     var binary: BinaryMessenger? = getFlutterEngine()?.dartExecutor?.binaryMessenger;
     if (binary != null){
         var mMessageChannel = BasicMessageChannel(binary,"basic_channel",StandardMessageCodec.INSTANCE);
         mMessageChannel.setMessageHandler({ message,callback->String
             print(message)
             callback.reply("android返回")
         });
     }
 }
}

iOS,在AppDelegate中didFinishLaunchingWithOptions中直接調(diào)用下面方法(Swift)

private func basicMessageChannelFunction(){
        if let controller:FlutterViewController = self.window.rootViewController as? FlutterViewController{
            let basicChannel:FlutterBasicMessageChannel = FlutterBasicMessageChannel.init(name: "basic_channel", binaryMessenger: controller as! FlutterBinaryMessenger)
            basicChannel.setMessageHandler { idMessage, callback in
                print(idMessage)
                callback("iOS返回");
            }
        }
    }

EventChannel的使用

flutter中

                          EventChannel _eventChannel = const EventChannel('event_channel');
                         StreamSubscription _streamSubscription = _eventChannel.receiveBroadcastStream().listen((event) {
                            print(event);
                          });
//_streamSubscription.cancle()記得關(guān)閉哦~

Android的MainActivity中

class MainActivity: FlutterActivity() {

    var eventSink: EventChannel.EventSink? = null

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
     super.configureFlutterEngine(flutterEngine)
     var binary: BinaryMessenger? = getFlutterEngine()?.dartExecutor?.binaryMessenger;
     if (binary != null){
         var eventChannel = EventChannel(binary,"event_channel");
         eventChannel.setStreamHandler(object : EventChannel.StreamHandler {
             override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                 eventSink = events!!
                 Log.w("android","eventchannel-onlisten")
                 eventSink!!.success("success")
                 Thread {
                     try {
                         while (true) {//每隔1秒,發(fā)送一次
                             Thread.sleep(1000)
                             runOnUiThread {
                                 eventSink!!.success("android")
                             }
                         }
                     } catch (e: InterruptedException) {
                         e.printStackTrace()
                     }
                 }.start()
             }
             override fun onCancel(arguments: Any?) {
                Log.w("android","eventchannel--cancle")
             }
         })

     }
 }
}

iOS中

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate,FlutterStreamHandler {

 
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    eventChannelFunction()
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }


    private func eventChannelFunction(){
        if let controller:FlutterViewController = self.window.rootViewController as? FlutterViewController{
            let eventChannel:FlutterEventChannel = FlutterEventChannel.init(name: "event_channel", binaryMessenger: controller as! FlutterBinaryMessenger)
            eventChannel.setStreamHandler(self)//(FlutterStreamHandler & NSObjectProtocol)?
            
        }
    }
    
    var eventSink:FlutterEventSink?
    
    @objc func sendMessage(){
        if let sink = eventSink{
            sink("iOS")
        }
    }
    
    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
        self.eventSink = events;
        eventSink!("success")
        Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(sendMessage), userInfo: nil, repeats: true)
//每隔1秒發(fā)一次
//eventSink?.endOfStream()
//eventSink?.error("error code", "error message","error details")
        return nil;
    }
    
    func onCancel(withArguments arguments: Any?) -> FlutterError? {
        print("iOS---eventchannel--cancle")
        return nil;
    }
    
}

注意: EventChannel涉及數(shù)據(jù)流的傳遞,各種計(jì)時(shí)器及stream使用完畢請(qǐng)務(wù)必關(guān)閉

更多相關(guān)內(nèi)容,可查閱 http://m.itdecent.cn/p/39575a90e820

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容