在文章Flutter框架分析(八)-Platform Channel中,咱們分析了EventChannel的原理和結構,並詳細講解了與其相關的一些核心類,例如StreamHandler和MethodCodec等,本文主要講解使用EventChannel的示例。java
EventChannel通常用於事件流的傳遞,用於將Platform的點擊等一系列事件等傳遞至Platform,僅支持native到Flutter的單向傳遞,接下來將分析其使用流程。markdown
流程以下:app
1)native端建立某channel name的EventChannel。框架
2)native端使用setStreamHandler函數,設置該EventChannel的StreamHandler。ide
3)Flutter端建立該channel name的EventChannel。函數
4)Flutter端建立該EventChannel的廣播流,通知native端channel建立完畢,並註冊廣播接收函數。post
5)native端剛剛註冊的StreamHandler收到發送的消息,在onListen中處理消息,拿到其中的EventSink接口,經過該接口給Flutter端傳遞廣播。ui
6)Flutter端處理該廣播。this
其流程圖以下:spa
Flutter端關鍵代碼以下:
class _EventChannelState extends State<EventChannelWidget> {
EventChannel _eventChannelPlugin = EventChannel('flutter2/testeventchannel');
StreamSubscription _streamSubscription;
@override
void initState() {
_streamSubscription = _eventChannelPlugin
.receiveBroadcastStream(["abc", 123, "你好"]).listen(_onToDart,
onError: _onToDartError, onDone: _onDone);
super.initState();
}
@override
void dispose() {
if (_streamSubscription != null) {
_streamSubscription.cancel();
_streamSubscription = null;
}
super.dispose();
}
void _onToDart(message) {
print("eventchanneltest _onToDart $message");
}
void _onToDartError(error) {
print("eventchanneltest _onToDartError $error");
}
void _onDone() {
print("消息傳遞完畢");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("event channel test"),
),
);
}
}
複製代碼
native端關鍵代碼以下:
class EventChannelActivity : FlutterActivity(), EventChannel.StreamHandler {
private var eventSink: EventSink? = null
private var mHandler: Handler? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mHandler = Handler()
}
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
Log.d("FirstNativeActivity", "configureFlutterEngine")
initChannel(flutterEngine)
}
private fun initChannel(flutter2Engine: FlutterEngine) {
EventChannel(flutter2Engine.dartExecutor, STREAM).setStreamHandler(this)
}
override fun onListen(arguments: Any, events: EventSink) {
eventSink = events
Log.i(TAG, "onListen Object:$arguments")
Toast.makeText(this, "onListen——obj:$arguments", Toast.LENGTH_SHORT).show()
mHandler!!.postDelayed( {
eventSink!!.success("hello")
eventSink!!.endOfStream()
} , 3000)
}
override fun onCancel(arguments: Any) {
Log.i(TAG, "onCancel:$arguments")
Toast.makeText(this, "onCancel——obj:$arguments", Toast.LENGTH_SHORT).show()
eventSink = null
}
companion object {
private const val TAG = "eventchanneltest"
const val STREAM = "flutter2/testeventchannel"
fun startActivity(activity: Activity) {
val intent = Intent(activity, EventChannelActivity::class.java)
activity.startActivity(intent)
}
}
}
複製代碼
本文主要介紹了EventChannel的使用流程,並列舉了一個使用EventChannel的示例。