Flutter学习之原生通信EventChannel

931 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

  • 本文主要介绍原生通信中的EventChannel,在iOS端和android端和flutter的交互通信

1. Flutter端

EventChannel主要是用于数据流(event streams)的通信, 客户端主动发送数据给 Flutter,通常用于状态的监听,比如网络变化传感器数据等。 可以看到Flutter端主要是一个接受的方法,持续的接受客户端发送的数据。里面实现也是对MethodChannel的封装 image.png

我们在flutter端实现倒计时

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';

class EventChannelPage extends StatefulWidget {
  const EventChannelPage({Key? key}) : super(key: key);

  @override 
  _EventChannelPageState createState() {
    return _EventChannelPageState();
  }
}

class _EventChannelPageState extends State<EventChannelPage> {
  String? title = Get.arguments['title'];

  final _eventChannel = const EventChannel('com.flutter.test.EventChannel');
  var _data = "倒计时";
  @override
  void initState() {
    super.initState();
    _eventChannel.receiveBroadcastStream().listen(_onData);
  }

_onData(event){
  if(mounted) {
    setState(() {
      final Map args = event as Map;
      _data = args['count'];
    });
  }
}


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title ?? ""),),
      body: Center(
        child: Text('倒计时:$_data'),
      ),
    );
  }
}

通过receiveBroadcastStream进行监听,listen获取监听数据

2. iOS端

我们创建一个EventChannelDemo对象,开启一个定时器

import UIKit

import Flutter

class EventChannelDemo :NSObject, FlutterStreamHandler{

    var count = 0

    var channel:FlutterEventChannel?

    var timer :Timer!

    var events: FlutterEventSink?

    

    override init() {

        super.init()

    }

    

    convenience init(messenger: FlutterBinaryMessenger) {


        self.init()

         channel = FlutterEventChannel(name: "com.flutter.test.EventChannel", binaryMessenger: messenger)

         channel?.setStreamHandler(self)

         startTimer()

            }

            

    func startTimer() {

        timer = Timer.scheduledTimer(timeInterval:1, target: self, selector:#selector(self.tickDown),userInfo:nil,repeats: true)

        

    }

    @objc func tickDown(){


        count += 1

        

        let args = ["count":count]

        if events != nil {

            events!(args)

        }

        

    }

        func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {

            self.events = events

            return nil

        }

        

        func onCancel(withArguments arguments: Any?) -> FlutterError? {

            self.events = nil

            self.timer.invalidate()

            self.timer = nil

            return nil

        }

}

在App Delegate中添加

_ = EventChannelDemo(messenger: controller.binaryMessenger)

运行结果

image.png

3. android端

我们同样是创建一个EventChannelDemo

package com.example.flutter_base_framework

import android.app.Activity
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.EventChannel
import java.util.*
import kotlin.concurrent.timerTask

class EventChannelDemo(var activity: Activity, messenger: BinaryMessenger): EventChannel.StreamHandler {
    private var channel: EventChannel
    private var index = 0
    private var events: EventChannel.EventSink? = null
    init {
        channel = EventChannel(messenger, "com.flutter.test.EventChannel")
        channel.setStreamHandler(this)
        startTimer()
    }


    fun startTimer() {
        var timer = Timer().schedule(timerTask {
            index++
            var map = mapOf("count" to "${index}")
            activity.runOnUiThread {
                events?.success(map)
            }

        }, 0, 1000)

    }

    override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
        this.events = events
    }

    override fun onCancel(arguments: Any?) {
        this.events = null
    }
}

我们在MainActivity中添加

EventChannelDemo(this,flutterEngine.dartExecutor.binaryMessenger)

运行如下

image.png

4.小结

EventChannel主要是通过对事件流的封装,让客户端不断发送event给flutter端,主要用于一些持续性事件,比如网络监听,电池电量变化,传感器数据等。内部实现也是通过对MethodChannel的封装进行实现。