当前位置:网站首页>Flutter Widget 如何启用和屏蔽点击事件
Flutter Widget 如何启用和屏蔽点击事件
2022-08-01 10:44:00 【️ 邪神】
AbsorbPointer 介绍
官方说明
/// A widget that absorbs pointers during hit testing.
一个可拦截子视图点击事件的Widget .
/// When [absorbing] is true, this widget prevents its subtree from receiving
/// pointer events by terminating hit testing at itself.
当 absorbing 属性值为 true 时 , AbsorbPointer 将用户的点击事件消耗掉不让其子组件接收到 .
///It still consumes space during layout and paints its child as usual.
AbsorbPointer 会占用布局的空间并包裹在子组件外面 .
/// It just prevents its children
/// from being the target of located events, because it returns true from
/// [RenderBox.hitTest].
AbsorbPointer 的作用就是控制子Widget 获取用户的点击事件 , 但不能将它作为点击事件的目标 .
absorbing 属性
Flutter AbsorbPointer 属性absorbing 设置
Column(
children: <Widget>[
Container(
width: 200.0,
height: 200.0,
margin: const EdgeInsets.only(top: 30.0),
child: AbsorbPointer(
absorbing: false,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.green.shade200,
),
onPressed: () {
print("AbsorbPointer 子Widget ElevatedButton absorbing: false onPressed");
},
child: const Text("absorbing: false"),
),
),
),
Container(
width: 200.0,
height: 200.0,
margin: const EdgeInsets.only(top: 30.0),
child: AbsorbPointer(
absorbing: true,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.blue.shade200,
),
onPressed: () {
print("AbsorbPointer 子Widget ElevatedButton absorbing: true onPressed");
},
child: const Text("absorbing: true"),
),
),
),
],
)
控制点击区域
当点击除开绿色和蓝色区域外的红色区域触发点击事件
Container(
width: 300.0,
height: 200.0,
child: Stack(
children: [
Positioned(
left: 0.0,
top: 0.0,
right: 0.0,
bottom: 0.0,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.red.shade200,
padding: const EdgeInsets.all(40.0),
),
onPressed: () {
},
child: null,
),
),
Positioned(
left: 30.0,
right: 30.0,
top: 30.0,
child: SizedBox(
width: 200.0,
height: 100.0,
child: AbsorbPointer(
absorbing: true,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.green.shade200,
),
onPressed: () {
},
child: const Text("点击区域一"),
),
),
),
),
Positioned(
left: 30.0,
right: 30.0,
bottom: 10.0,
child: SizedBox(
width: 200.0,
height: 40.0,
child: AbsorbPointer(
absorbing: true,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.blue.shade200,
),
onPressed: () {
},
child: const Text("点击区域二"),
),
),
),
),
],
)),
IgnorePointer介绍
官方说明
/// A widget that is invisible during hit testing.
一个在接收到点击事件过程中不可见的Widget .
/// When [ignoring] is true, this widget (and its subtree) is invisible to hit testing.
当 ignoring 属性值为true时 , IgnorePointer 在收到点击事件时是不可见的 .
It still consumes space during layout and paints its child as usual.
IgnorePointer 在收到点击事件后虽然不可见,但是会占用空间的,同时会完成子Widget的绘制 .
ignoring 属性
控制子Widget是否可点击
Container(
width: 300.0,
height: 200.0,
color: Colors.red.shade200,
child: IgnorePointer(
ignoring: false,
key: ignorePointerKey,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.green.shade200,
),
onPressed: () {
RenderBox? renderBox = ignorePointerKey.currentContext?.findRenderObject() as RenderBox?;
print("IgnorePointer onPressed 点击区域一 ${renderBox?.size}");
},
child: const Text("点击区域一"),
),
),
),
AbsorbPointer使用场景
常见组件会提供一种禁止输入的方法 .
例如 : 将TextButton的onPressed回掉设置为空值 .
const TextButton(
child: Text("点击我"),
onPressed: null,
)
可以设置ListView 属性 physics , 让ListView不要滚动
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: 3,
itemBuilder: (context, index) {
return Container();
})
当我们需要将屏幕范围内的所有组件都禁止操作 (点击、滚动、输入时) 时, 我们需要 将所有组件 用 AbsorbPointer包裹起来 , 并设置属性值 absorbing , 获取取消屏蔽也可以.
IgnorePointer 使用场景
用户和界面交互过程中 , 我们有时需要某些区域无法交互 , 就需要将无法被用户进行操作的区域用IgnorePointer 进行包裹 并且设置 ignoring 属性为true . 我们可以用IgnorePointer可以做到将包裹区域的子Widget 不能进行点击、单击、拖动、滚动、所有动作 .
AbsorbPointer和IgnorePointer 区别
AbsorbPointer | IgnorePointer |
---|---|
获取点击事件前后都可见 | 获取到点击事件后不可见 |
可以不和子组件共享点击事件 | 和子widget共享事件,否则都不能获取点击事件 |
点击事件不可穿透 | 点击事件可穿透 |
Flutter小部件之AbsorbPointer
Flutter 浅谈AbsorbPointer和IgnorePointer的区别
深入研究flutter组件之(AbsorbPointer
边栏推荐
- .NET深入解析LINQ框架(三:LINQ优雅的前奏)
- Generate certificates using KeyStore
- Promise learning (2) An article takes you to quickly understand the common APIs in Promise
- URL.createObjectURL、URL.revokeObjectURL、Uint8Array、Blob使用详解
- 利用正则表达式的回溯实现绕过
- 各位大拿,安装Solaris 11.4操作系统,在安装数据库依赖包的时候包这个错,目前无原厂支持,也无安装盘,联网下载后报这个错,请教怎么解决?
- Promise学习(二)一篇文章带你快速了解Promise中的常用API
- Cross-domain network resource file download
- Dataset之mpg:mpg数据集的简介、下载、使用方法之详细攻略
- Visualization - Superset installation and deployment
猜你喜欢
CTFshow,命令执行:web33
gc的意义和触发条件
redis6 跟着b站尚硅谷学习
Why Metropolis–Hastings Works
mysql login in cmd and basic operations of database and table
What's up with VS "Cannot find or open PDB file"?How to solve
ClickHouse多种安装方式
小程序毕设作品之微信美食菜谱小程序毕业设计成品(3)后台功能
STM32 Personal Notes - Watchdog
Drawing arrows of WPF screenshot control (5) "Imitation WeChat"
随机推荐
回归预测 | MATLAB实现RNN循环神经网络多输入单输出数据预测
Message queue interview latest finishing (2022)
小程序毕设作品之微信美食菜谱小程序毕业设计成品(1)开发概要
CTFshow,命令执行:web32
CTO strongly banning the use of the Calendar, that in what?
ModelArts-based object detection YOLOv3 practice [play with HUAWEI CLOUD]
MacOS下postgresql(pgsql)数据库密码为什么不需要填写或可以乱填写
如何从完美的智能合约中窃取 1 亿美元
Enterprise WeChat group: robot timing reminder function database configuration
jmeter
ClickHouse入门介绍与其特性
URL.createObjectURL、URL.revokeObjectURL、Uint8Array、Blob使用详解
Guangyu Mingdao was selected into the list of pilot demonstration projects for the development of digital economy industry in Chongqing in 2022
微信公众号授权登录后报redirect_uri参数错误的问题
STM32 Personal Notes - Watchdog
gc的意义和触发条件
深度学习 | MATLAB实现GRU门控循环单元gruLayer参数设定
Basic configuration commands of cisco switches (what is the save command of Huawei switches)
SAP ABAP OData 服务如何支持 $orderby (排序)操作试读版
The first experience of Shengsi large model experience platform——Take the small model LeNet as an example