在大前端的开发中,必然存在各类各样和用户交互的状况:好比手指点击、手指滑动、双击、长按等等。html
全部内容首发于公众号:coderwhy前端
在Flutter中,手势有两个不一样的层次:vue
Pointer 表明的是人机界面交互的原始数据。一共有四种指针事件:web
PointerDownEvent
指针在特定位置与屏幕接触
PointerMoveEvent
指针从屏幕的一个位置移动到另一个位置
PointerUpEvent
指针与屏幕中止接触
PointerCancelEvent
指针由于一些特殊状况被取消
Pointer的原理是什么呢?算法
在指针落下时,框架作了一个 hit test 的操做,肯定与屏幕发生接触的位置上有哪些Widget以及分发给最内部的组件去响应;api
事件会沿着最内部的组件向组件树的根冒泡分发;数据结构
而且不存在用于取消或者中止指针事件进一步分发的机制;app
原始指针事件使用Listener来监听:框架
class HomeContent extends StatelessWidget {
@override Widget build(BuildContext context) { return Center( child: Listener( child: Container( width: 200, height: 200, color: Colors.red, ), onPointerDown: (event) => print("手指按下:$event"), onPointerMove: (event) => print("手指移动:$event"), onPointerUp: (event) => print("手指抬起:$event"), ), ); } } 复制代码
Gesture是对一系列Pointer的封装,官方建议开发中尽量使用Gesture,而不是Pointerless
Gesture分层很是多的种类:
点击:
双击:
长按:
纵向拖拽:
横线拖拽:
移动:
onHorizontalDragStart
或者
onVerticalDragStart
,该回调方法会引起崩溃;
onHorizontalDragUpdate
或者
onVerticalDragUpdate
,该回调方法会引起崩溃。
onHorizontalDragEnd
或者
onVerticalDragEnd
,该回调方法会引起崩溃。
从Widget的层面来监听手势,咱们须要使用:GestureDetector
class HYHomePage extends StatelessWidget {
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("手势测试"), ), body: GestureDetector( child: Container( width: 200, height: 200, color: Colors.red, ), onTap: () { }, onTapDown: (detail) { print(detail.globalPosition); print(detail.localPosition); }, onTapUp: (detail) { print(detail.globalPosition); print(detail.localPosition); } ), ); } } 复制代码
在组件之间若是有事件须要传递,一方面能够一层层来传递,另外一方面咱们也可使用一个EventBus工具来完成。
其实EventBus在Vue、React中都是一种很是常见的跨组件通讯的方式:
这里咱们直接选择第三方的EventBus:
dependencies:
event_bus: ^1.1.1 复制代码
第一:咱们须要定义一个但愿在组件之间传递的对象:
class UserInfo {
String nickname; int level; UserInfo(this.nickname, this.level); } 复制代码
第二:建立一个全局的EventBus对象
final eventBus = EventBus();
复制代码
第三:在某个Widget中,发出事件:
class HYButton extends StatelessWidget {
@override Widget build(BuildContext context) { return RaisedButton( child: Text("HYButton"), onPressed: () { final info = UserInfo("why", 18); eventBus.fire(info); }, ); } } 复制代码
第四:在某个Widget中,监听事件
class HYText extends StatefulWidget {
@override _HYTextState createState() => _HYTextState(); } class _HYTextState extends State<HYText> { String message = "Hello Coderwhy"; @override void initState() { super.initState(); eventBus.on<UserInfo>().listen((data) { setState(() { message = "${data.nickname}-${data.level}"; }); }); } @override Widget build(BuildContext context) { return Text(message, style: TextStyle(fontSize: 30),); } } 复制代码
备注:全部内容首发于公众号,以后除了Flutter也会更新其余技术文章,TypeScript、React、Node、uniapp、mpvue、数据结构与算法等等,也会更新一些本身的学习心得等,欢迎你们关注