Flutter框架分析-EventChannel

1.  前言

在文章Flutter框架分析(八)-Platform Channel中,咱們分析了EventChannel的原理和結構,並詳細講解了與其相關的一些核心類,例如StreamHandlerMethodCodec等,本文主要講解使用EventChannel的示例。java

2.  使用流程

EventChannel通常用於事件流的傳遞,用於將Platform的點擊等一系列事件等傳遞至Platform,僅支持nativeFlutter的單向傳遞,接下來將分析其使用流程。markdown

流程以下:app

1)native端建立某channel name的EventChannel框架

2)native端使用setStreamHandler函數,設置該EventChannelStreamHandleride

3)Flutter端建立該channel name的EventChannel函數

4)Flutter端建立該EventChannel的廣播流,通知native端channel建立完畢,並註冊廣播接收函數。post

5)native端剛剛註冊的StreamHandler收到發送的消息,在onListen中處理消息,拿到其中的EventSink接口,經過該接口給Flutter端傳遞廣播。ui

6)Flutter端處理該廣播。this

其流程圖以下:spa

image.jpeg

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)
        }
    }
}
複製代碼

3. 小結

本文主要介紹了EventChannel的使用流程,並列舉了一個使用EventChannel的示例。

相關文章
相關標籤/搜索