FlutterFlutter原理篇:事件机制传播与响应机制与
HitTestBehavior的介绍
今天⼜到了我们Flutter原理篇的内容了,今天给⼤家讲的是Flutter的事件传播与机制,顺便再给⼤家介绍下传播⾥⾯HitTestBehavior的作⽤(感觉很多⽂章对于这个的介绍不是很详细),好了让我们开始吧:
⽼实说⽹络上已经有不少⽂章介绍了Flutter的事件机制了,为什么我还要出⼀篇来写呢,主要是⼀⽅⾯我觉得⽹络上有些⾼⼿写的并没有通俗易懂,他们的内容没有问题,但是语⾔组织上⾯可能没有连贯,导致我在看他们的⽂章的时候有时候总觉得”跟不上节拍“,觉得他们没有按照顺序娓娓道来,给读者的阅读体验性可能没有那么好,最重要的是就怕读者看完了没看懂⾥⾯的重要思想这就不太好了,所以今天由我给⼤家来⼀偏通俗易懂的介绍Flutter事件传播机制的⽂章,让你在阅读的时候⼏乎⽆障碍理解
其实我们从事移动端开发,对于事件传递并不陌⽣,⽆论是Android还是iOS,还是Web等等都有这⼀套机制在⾥⾯,⽽且机制都⼤同⼩异,对于Flutter事件机制我觉得⽐较像iOS,因为他连函数名字都叫⼀样的,好了回到正题来:
⾸先我们先抛出个结论就是Flutter的事件传播机制流程⼤致分为两个步骤:
1 命中测试阶段,我习惯叫他为hitT e s t阶段
flutter开发app
这个阶段⾥⾯主要是调⽤hitTest⽅法去测试⼀些列可以被响应的RenderObject对象(注意只有RenderObject才会有hitTest⽅法),然后把这些对象添加进⼀个队列⾥⾯保存起来,刚刚说到iOS,这⾥⾯hitTest⽅法的名字与iOS是⼀样的但是作⽤却不太⼀样,iOS⾥⾯的hitTest⽅法是去寻⼀个最合适响应的对象返回,⽽Flutter⾥⾯却是所有可以命中测试的对象都保存起来,这个阶段的细节我们在下⾯的代码再来讲解
2 事件传播阶段
当第⼀个阶段完成以后你的队列⾥⾯就有了N个可以命中的RenderObject对象,这个时候进⾏事件分发dispatch,其实⾮常简单就是循环调⽤命中的RenderObject对象的handleEvent
⽅法,调⽤顺序是先进先出(⼤家要记住这⾥)
好了,原理⾮常的简单,让我去结合代码看看细节是怎么样的,⾸先事件命中测试是在 PointerDownEvent 事件触发时进⾏的,⼀个完成的事件流是 down > move > up (cancle) (这⾥⽆论是Android,iOS都是⼀样的),⾸先触发新事件时,flutter 会调⽤此⽅法
_handlePointerEventImmediately,如下:
GestureBinding._handlePointerEventImmediately