flutter 中监听滑动事件
作者:tabbin 发布时间:2021-10-05 11:39:00
标签:flutter,监听,滑动
在移动端,各个平台或 UI 系统的原始指针事件模型基本都是一致,即:一次完整的事件分为三个阶段:手指按下、手指移动、和手指抬起,而更高级别的手势(如点击、双击、拖动等)都是基于这些原始事件的。
Flutter 中可以使用 Listener widget 来监听原始触摸事件,它也是一个功能性 widget。
Listener 的常见属性
属性 | 类型 | 说明 |
---|---|---|
onPointerDown | (PointerDownEvent event){} | 手指按下时触发 |
onPointerMove | (PointerDownEvent event){} | 手指在屏幕滑动时触发 |
onPointerUp | (PointerDownEvent event){} | 手指离开屏幕时触发 |
onPointerCancel | (PointerDownEvent event){} | 取消触摸时触发 |
Listener({
Key key,
this.onPointerDown, //手指按下回调
this.onPointerMove, //手指移动回调
this.onPointerUp,//手指抬起回调
this.onPointerCancel,//触摸事件取消回调
this.behavior = HitTestBehavior.deferToChild, //在命中测试期间如何表现
Widget child
})
用法如下:
Listener(
onPointerDown: (dowPointEvent){},
onPointerMove: (movePointEvent){},
onPointerUp: (upPointEvent){},
child: Container(
child: Text('Listener的监听')
)
);
使用场景一: 下拉刷新,上拉加载
如果实现下拉刷新,必须借助 RefreshIndicator,在 listview 外面包裹一层 RefreshIndicator,然后在 RefreshIndicator 里面实现 onRefresh 方法。监听的方法有很多种,就不一一阐述了,这里主要说一下经常使用的两种方法。
/// 下拉刷新,这里必须使用async,不然会报错
Future<Null> _refresh() async {
final Completer<Null> completer = new Completer<Null>();
_dataList.clear(); // 清空数据
setState(() {
page = 1;
});
loadData(completer); // 加载数据
return completer.future;
}
加载更多需要对 ListView 进行监听,所以需要进行 * 的设置,在 State 中进行 * 的初始化。
ScrollController _scrollController = new ScrollController(); // 初始化滚动 * ,加载更多使用
1、直接监听_scrollController,根据是否滑动到底部来判断是否需要加载更多
_scrollController.addListener(() {
// 如果滑动到底部
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
// do something
}
});
RefreshIndicator(
onRefresh: _refresh, // 下拉刷新
child: ListView.builder(
padding: EdgeInsets.only(bottom: Adapt.px(40)),
shrinkWrap: true,
controller: _scrollController,
physics: AlwaysScrollableScrollPhysics(),
itemCount: _dataList.length,
itemBuilder: (context, item) {
return listCard(_dataList[item]);
}
)
)
2、使用上述的 Listener 来监听,通过 Listener 的 onPointerMove(手指在屏幕上滑动)来监听滑动的距离,当滑动到底部时加载更多数据
new Listener(
onPointerMove: (event) {
var position = event.position.distance;
var detal = position - lastDownY;
if (detal > 0) {
print("================向下移动================");
} else {
// 所摸点长度 +滑动距离 = IistView的长度 说明到达底部
print("================向上移动================");
print("scrollController==滑动距离=======${(position - downY)}");
var scrollExtent = scrollController.position.maxScrollExtent;
print("scrollController==ListView最大长度===${scrollExtent}");
print("scrollController==所摸点长度===${scrollController.offset}");
print("scrollController==所摸点离屏幕距离===${position}");
var result = scrollController.offset +(position - downY).abs();
if (result >= scrollExtent) {
print("scrollController====到达底部");
lastListLength = scrollExtent;
loadMore(); // 加载更多数据
}
}
lastDownY = position;
},
child: new ListView.builder(
controller: scrollController,
itemCount: datas == null ? 0 : datas.length,
itemBuilder: (BuildContext context, int index) {
return Container(child: Text('列表${index}') )
}
)
);
使用场景二 , 滑动屏幕时,隐藏掉键盘
日常使用 TextField 时候,弹出来的键盘如果是按钮提交有时候会出现键盘不自动隐藏关闭的情况,可以触发关闭弹出来的键盘。
FocusScope.of(context).requestFocus(FocusNode());
// 或者
FocusNode _foucusNode = new FocusNode();
_foucusNode.unfocus();
使用 Listener 监听,在滑动屏幕的时候关闭键盘
Listener(
onPointerMove: (movePointEvent){
_foucusNode.unfocus();
},
child: return SingleChildScrollView(
controller: _scrollController,
child: Column(
children: <Widget>[
// some widget
],
)
)
)
来源:https://learnku.com/articles/30338


猜你喜欢
- OkHttp流程图OkHttp基本使用gradle依赖implementation 'com.squareup.okhttp3:ok
- 定义Builder模式是一步步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构建过程。该模式是
- 一、基于配置的异常处理SpringMVC 提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolv
- 对流进行操作时要引用 using System.IO; 命名空间 FileStream常用的属性和方法:属性:CanRead 判断当前流是否
- java 设计模式之单例模式前言:在软件开发过程中常会有一些对象我们只需要一个,如:线程池(threadpool)、缓存(cac
- 前言相信大家在Android日常开发中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了。以前为了偷懒就直接去github
- 本文实例为大家分享了java使用HashMap实现斗地主的具体代码,供大家参考,具体内容如下案例介绍按照斗地主的规则,完成洗牌发牌的动作。
- 添加群机器人可以查看这篇文章:添加机器人到钉钉群 使用命令行工具curl快速验证自定义机器人是否可以正常工作。可以使用如下命令,把对应的链接
- 项目需求最近项目中有一个需求就是让Java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,然后根据模板文件(PPT),将数据库数
- 本文实例为大家分享了Unity shader实现遮罩效果的具体代码,供大家参考,具体内容如下效果:shader代码:Shader "
- 游戏介绍:拼图游戏是一款经典的益智游戏,游戏难度分为 简单、正常、困难 三种难度,分别对应3*3,4*4,5*5布局,游戏开始前图片被随机打
- 目录前言1、饿汉式(线程安全)⭐2、懒汉式(线程不安全)⭐3、懒汉式(加锁)4、懒汉式(双重校验锁)⭐5、单例模式(静态内部类)6、单例模式
- 启动协程的基本方式1.GlobalScope.launch代码示例:fun testGlobalScope() {  
- 方法一:Convert.ToDateTime(string)string格式有要求,必须是yyyy-MM-dd hh:mm:ss方法二:Co
- AOP拦截Controller获取@PathVariable注解传入参数前言:最近项目中需要对controller传入的应用标识(appMa
- Java读取json数据并存入数据库1. pom依赖<dependency> &nbs
- 在项目开发中,我们经常需要进行动态添加组件,其中可添加的部分有两项:布局和组件 其中,添加的布局主要有RelativeLayout
- SpringBoot自带Tomcat,所以我们的项目可以单独部署,不需要依赖Window、Linux系统中的服务器,所以打包出来的Jar包是
- 本文实例为大家分享了Java使用组件编写窗口下载网上文件的具体代码,供大家参考,具体内容如下如图实现代码:package com.rain.
- 经典分布式事务,是相对互联网中的柔性分布式事务而言,其特性为ACID原则,包括原子性(Atomictiy)、一致性(Consistency)