持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
- 本文主要介绍原生通信中的EventChannel,在iOS端和android端和flutter的交互通信
1. Flutter端
EventChannel主要是用于数据流(event streams)的通信, 客户端主动发送数据给 Flutter,通常用于状态的监听,比如网络变化、传感器数据等。 可以看到Flutter端主要是一个接受的方法,持续的接受客户端发送的数据。里面实现也是对MethodChannel的封装
我们在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)
运行结果
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)
运行如下
4.小结
EventChannel主要是通过对事件流的封装,让客户端不断发送event给flutter端,主要用于一些持续性事件,比如网络监听,电池电量变化,传感器数据等。内部实现也是通过对MethodChannel的封装进行实现。