第二百九十五回

2024-01-30 00:04
文章标签 十五 第二百

本文主要是介绍第二百九十五回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 概念介绍
  • 2. 使用方法
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中分享了一个好用的Json工具,本章回中将介绍如何处理ListView中的事件冲突.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

在Flutter应用开发中,ListView组件是实现滚动列表展示内容的基石。当我们在ListView的item项上添加点击跳转功能时,通常会遇到这样一个问题:如果直接使
用Listener组件来监听点击事件,那么在用户试图滑动列表时,可能由于手势判断的问题导致误触发点击事件,从而不当地跳转到详情页面。这便是我们说的事件冲突。
本章回中将详细介绍如何利用GestureDetector组件巧妙地解决这一冲突,并确保ListView既能流畅滑动又能准确响应点击事件。

2. 使用方法

下面是一个示例代码,代码中构建一个包含多个可点击item项的ListView,点击Item时跳转到DetailPage,不过这里省略了DetailPage页面的内容。

ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return Listener(onPointerDown: (_) {// 点击item如跳转至详情页Navigator.push(context, MaterialPageRoute(builder: (_) => DetailPage(item: items[index])));},child: ListTile(title: Text(items[index].title)),);},
);

然而,Listener组件对于任何触摸事件都非常敏感,包括那些本应用于滑动ListView的手势。这就意味着用户在尝试滑动列表时,可能无意间触发了详情页的跳转。
此时会跳转到item的详情页面。我们的经验是使用GestureDetector组件替换Listener组件,这样可以确保ListView既能流畅滑动又能准确响应点击事件。

3. 示例代码

ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return GestureDetector(onTap: () {// 点击item如跳转至详情页Navigator.push(context, MaterialPageRoute(builder: (_) => DetailPage(item: items[index])));},child: ListTile(title: Text(items[index].title)),);},
);

上面的示例代码中使用了GestureDetector组件替换了Listener组件。GestureDetector不仅能够精确地区分点击和其他手势,而且提供了更多自定义选项以适应
不同场景的需求。例如,可以通过设置behavior属性来调整其与其他手势识别器之间的交互方式,比如在ScrollView内防止消耗所有手势:

GestureDetector(behavior: HitTestBehavior.opaque, onTap: () {...},child: ...
)

示例代码中的behavior属性值有多种,详细的功能如下:

  • HitTestBehavior.opaque:此模式下,GestureDetector会消费它覆盖的所有手势。
  • HitTestBehavior.translucent:在此模式下,手势会被传递给子组件,同时GestureDetector也会接收到这些手势。
  • HitTestBehavior.deferToChild:在这种情况下,只有当子组件本身没有处理手势时,GestureDetector才会处理手势。
    在实际项目中,我们可以根据实际需求选择合适的HitTestBehavior可以进一步优化手势识别效果。

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:

  • ListView时,使用GestureDetector和Listener都可以响应item的点击事件;
  • 我们推荐使用能GestureDetector组件,它可以有效解决滑动与点击冲突问题,提供更加顺畅且符合用户预期的交互体验;
  • GestureDetector组件的behavior属性可以控制手势的使用范围,它有不同的值供我们选择;
    看官们,与"如何处理ListView中的事件冲突"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

这篇关于第二百九十五回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658558

相关文章

【重学 MySQL】十五、过滤数据

【重学 MySQL】十五、过滤数据 基本用法使用`AND`、`OR`和`NOT`使用`IN`操作符使用`BETWEEN`操作符使用`LIKE`操作符使用`IS NULL`和`IS NOT NULL` 在MySQL中,过滤数据主要通过WHERE子句来实现。WHERE子句允许你指定条件来过滤从表中检索出来的行。只有当行满足WHERE子句中的条件时,这些行才会被包含在查询结果中。

Flink实战案例(十五):Flink的分布式缓存

分布式缓存   Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。   此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。   当程序执行,Flink自动将文件或者目录

【硬刚ES】ES基础(十五)第一部分总结

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

SpringBoot教程(十五) | SpringBoot集成RabbitMq(死信队列、延迟队列)

SpringBoot教程(十五) | SpringBoot集成RabbitMq(死信队列、延迟队列) (一)死信队列使用场景具体用法前提示例: (二)延迟队列使用场景方法一:通过死亡队列实现方法二:通过延迟消息插件(rabbitmq_delayed_message_exchange)实现 (一)死信队列 死信队列是一个重要的概念,用于处理那些因各种原因无法被正常消费的消息。 它

C++(十五)继承 part1

一、继承的概念         继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。         下面我们看到没有继承之前我

SEO之网站结构优化(十五-CMS系统)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 15、CMS系统 现在的网站绝大多数是通过CMS系统制作和管理的,SEO人员优化网站就会受限于CMS 系统本身的灵活性和功能。市面上有很多开源免费的CMS系统,如中文的dede(织梦)、

leetcode解题思路分析(九十五)825 - 831 题

适龄的朋友 人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,ages[i] 表示第 i 个人的年龄。当满足以下任一条件时,A 不能给 B(A、B不为同一人)发送好友请求: age[B] <= 0.5 * age[A] + 7 age[B] > age[A] age[B] > 100 && age[A] < 100 否则,A 可以给 B 发送好友请求。 注意如果 A 向 B 发出了请求,不

【人工智能】Transformers之Pipeline(十五):总结(summarization)

​​​​​​​ 目录 一、引言  二、总结(summarization) 2.1 概述 2.2 BERT与GPT的结合—BART 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 ​​​​​​​ 2.4.3 pipeline返回参数 ​​​​​​​​​​​​​​ 2.5 pipe

【RTT-Studio】详细使用教程十五:独立看门狗使用

文章目录 一、简介二、初始化配置三、实际使用 一、简介   STM32 有两个看门狗,独立看门狗和窗口看门狗,独立看门狗又称宠物狗,窗口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同时会产生一个中断。   独立看门狗 (IWDG) 由专用的内部低速时钟 (LSI) 驱动,即使主时钟发生故障它

OCI编程高级篇(十五) 设置字段数据入口

设置完字段信息之后,就要设置字段数据的入口,这里用到的函数叫做OCIDirPathColArrayEntrySet(),在这之前要进行直接路径装载准备工作,用到的函数为OCIDirPathPrepare(),我们分别来看一下这两个函数。 sword OCIDirPathPrepare ( OCIDirPathCtx *dpctx,     OCISvcCtx  *svchp,     OCIEr