Flutter笔记 - ListTile组件及其应用

Flutter笔记
ListTile组件及其应用

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/133411883



1. 功能描述

ListTile 组件表示一个包含一到三行文本的列表项,它可以选择带有图标或其它组件。

需要特别说明的是,虽然 ListTile 经常与 ListView 一起使用,但它并不仅限于 ListView。实际上,可以在许多其他布局中使用 ListTile,以创建各种不同的用户界面元素。例如,可以将 ListTile 放置在 ColumnRowCard 等其他布局中,以创建自定义的列表项或卡片。

2. 主要属性

ListTile 组件有以下常用属性:

属性描述
leading列表项的前导部分,通常是一个图标或自定义小部件。
title列表项的主要标题文本。
subtitle列表项的副标题文本。
trailing列表项的尾部部分,通常包含右侧图标或控件。
isThreeLine布尔值,指示是否为三行列表项。如果为 true,则可以显示额外的文本行。否则,只有一行文本。
dense布尔值,指示是否启用紧凑模式,紧凑模式下,文本和图标的大小将减小。
visualDensity控制布局紧凑性的视觉密度。
shape定义列表项的形状的形状对象。
style文本的样式。
selectedColor选定时的背景颜色。
iconColor图标的颜色。
textColor文本的颜色。
titleTextStyle标题文本的样式。
subtitleTextStyle副标题文本的样式。
leadingAndTrailingTextStyle前导和尾部部分文本的样式。
contentPadding内容的内边距。
enabled布尔值,指示列表项是否可用。如果为 false,则列表项将不可点击。
onTap点击列表项时触发的回调函数。
onLongPress长按列表项时触发的回调函数。
onFocusChange获得或失去焦点时触发的回调函数。
mouseCursor指针悬停在列表项上时的鼠标指针样式。
selected布尔值,指示列表项是否已选择。
focusColor获取焦点时的背景颜色。
hoverColor鼠标悬停时的背景颜色。
splashColor点击列表项时的水波纹颜色。
focusNode用于处理焦点状态的 FocusNode 对象。
autofocus布尔值,指示列表项是否自动获取焦点。
tileColor列表项的背景颜色。
selectedTileColor选中列表项时的背景颜色。
enableFeedback是否启用触觉反馈。
horizontalTitleGap标题与前导/尾部之间的水平间距。
minVerticalPadding最小垂直内边距。
minLeadingWidth最小前导宽度。
titleAlignment标题文本的对齐方式。

3. ListTile的组成元素

  1. 前导部分(leading):通常是显示在 ListTile 左侧的部分,可以是一个图标(Icon)、缩略图(Image)或其他前导元素。

  2. 主标题(title):通常是 ListTile 的主要文本内容,显示在前导部分(如果有的话)的右侧,用于描述列表项的主要信息。

  3. 副标题(subtitle):可选项,显示在主标题下面,用于显示列表项的附加信息或次要信息。

  4. 尾部部分(trailing):通常是显示在 ListTile 右侧的部分,可以是一个图标(Icon)、按钮或其他尾部元素。

这些是 ListTile 的基本组成部分,可以根据需要自定义和组合这些元素,以创建符合你设计需求的列表项。

4. 案例:一个简单的购物车UI

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return const MaterialApp(home: ShoppingCartScreen(),);}
}class ShoppingCartScreen extends StatelessWidget {const ShoppingCartScreen({super.key});Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('购物车'),),body: ListView.builder(itemCount: 9,itemBuilder: (context, index) {return ShoppingCartItem(productName: '商品$index',productDescription: '商品$index的一些描述',productQuantity: 1, // 产品数量productImageUrl:'https://gw.alicdn.com/bao/uploaded/i4/1711217080/O1CN018eotkR22Ah1q4eDcs_!!1711217080.jpg_300x300q90.jpg', // 替换为你的网络图片 URL);},),);}
}class ShoppingCartItem extends StatefulWidget {final String productName;final String productDescription;final int productQuantity;final String productImageUrl;const ShoppingCartItem({Key? key,required this.productName,required this.productDescription,required this.productQuantity,required this.productImageUrl,}) : super(key: key);State<ShoppingCartItem> createState() => _ShoppingCartItemState();
}class _ShoppingCartItemState extends State<ShoppingCartItem> {bool isChecked = false;Widget build(BuildContext context) {return Card(child: ListTile(leading: Checkbox(value: isChecked,onChanged: (value) {setState(() {isChecked = value!;});},),title: Text(widget.productName),subtitle: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Text(widget.productDescription),Text('数量:${widget.productQuantity}'),],),trailing: Image.network(widget.productImageUrl,width: 50,height: 50,fit: BoxFit.cover,),),);}
}

效果如下:

在这里插入图片描述

5. 案例2:一个新闻列表

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return const MaterialApp(home: NewsListScreen(),);}
}class NewsListScreen extends StatefulWidget {const NewsListScreen({super.key});State<NewsListScreen> createState() => _NewsListScreenState();
}class _NewsListScreenState extends State<NewsListScreen> {List<String> newsList = List.generate(5, (index) => '新闻标题 $index');Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('新闻列表'), // 设置页面标题),body: ListView.builder(itemCount: newsList.length, // 使用列表的长度itemBuilder: (context, index) {return NewsListItem(headline: newsList[index], // 新闻标题description: '新闻描述 $index', // 新闻描述imageUrl:'https://pics6.baidu.com/feed/5ab5c9ea15ce36d3733d7035255cf48be950b132.jpeg@f_auto?token=29586d3d429228d0a2c251be0f9a8a67', // 替换为你的新闻图片网络 URLonDelete: () {// 处理删除事件setState(() {newsList.removeAt(index); // 移除对应索引的新闻标题});},);},),);}
}class NewsListItem extends StatelessWidget {final String headline;final String description;final String imageUrl;final VoidCallback onDelete;const NewsListItem({Key? key,required this.headline,required this.description,required this.imageUrl,required this.onDelete,}) : super(key: key);Widget build(BuildContext context) {return Card(child: ListTile(contentPadding: const EdgeInsets.all(16.0),leading: Image.network(imageUrl, // 使用网络图片 URLwidth: 80,height: 80,fit: BoxFit.cover,),title: Text(headline,style: const TextStyle(fontWeight: FontWeight.bold),),subtitle: Text(description),trailing: IconButton(icon: const Icon(Icons.delete),onPressed: onDelete, // 触发删除操作),onTap: () {// 处理点击事件,例如打开新闻详情页面// 这里可以添加你的代码逻辑},),);}
}

效果如下:

在这里插入图片描述

6. 案例3:模拟文件资源管理器页面

import 'package:flutter/material.dart';void main() {runApp(const FileExplorerApp());
}class FileExplorerApp extends StatelessWidget {const FileExplorerApp({super.key});Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('文件资源管理器'),),body: const FileExplorerUI(),),);}
}class FileExplorerUI extends StatefulWidget {const FileExplorerUI({super.key});State<FileExplorerUI> createState() => _FileExplorerUIState();
}class _FileExplorerUIState extends State<FileExplorerUI> {SortMode _sortMode = SortMode.name;Widget build(BuildContext context) {return Column(crossAxisAlignment: CrossAxisAlignment.stretch,children: [Row(mainAxisAlignment: MainAxisAlignment.end,children: [IconButton(icon: const Icon(Icons.view_list),onPressed: () {setState(() {});},),IconButton(icon: const Icon(Icons.view_module),onPressed: () {setState(() {});},),IconButton(icon: const Icon(Icons.view_headline),onPressed: () {setState(() {});},),DropdownButton<SortMode>(value: _sortMode,onChanged: (value) {setState(() {_sortMode = value!;});},items: SortMode.values.map<DropdownMenuItem<SortMode>>((mode) => DropdownMenuItem(value: mode,child: Text(mode.toString().split('.').last),),).toList(),),],),Expanded(child: ListView.builder(itemCount: 10, // 虚拟数据,实际根据文件列表长度设置itemBuilder: (context, index) {return ListTile(leading: const Icon(Icons.folder), // 根据文件类型设置图标title: Text('文件或文件夹 $index'), // 根据文件名称设置subtitle: const Text('文件大小: 1 KB'), // 根据文件大小设置trailing: const Text('修改日期: 2023-01-01'), // 根据修改日期设置);},),),],);}
}enum ViewMode { details, largeIcon, smallIcon }enum SortMode { name, size, type, date }

效果如图所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147626.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Java每日一题】— —第十九题:用二维数组存放九九乘法表,并将其输出。(2023.10.03)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十九题。 &#x1f3af;问题&#xff1a; 用二维数组存放九九乘法表&#xff0c;并将其输出。 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; System.out.println("九九乘法表如…

Python中匹配模糊的字符串

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库&#xff0c;它允许我们在python中进行模糊字符串匹配。 此外&#xff0c;我们将学习如何使用process 模块&#xff0c;该模块允许我们在模糊…

【AI视野·今日NLP 自然语言处理论文速览 第四十五期】Mon, 2 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 2 Oct 2023 Totally 44 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Efficient Streaming Language Models with Attention Sinks Authors Guangxuan Xiao, Yuandong Tian, Beidi C…

Redis与分布式-分布式锁

接上文 Redis与分布式-集群搭建 1.分布式锁 为了解决上述问题&#xff0c;可以利用分布式锁来实现。 重新复制一份redis&#xff0c;配置文件都是刚下载时候的不用更改&#xff0c;然后启动redis服务和redis客户。 redis存在这样的命令&#xff1a;和set命令差不多&#xff0…

淘宝天猫渠道会员购是什么意思?如何开通天猫淘宝渠道会员购有什么用?

淘宝天猫渠道会员购是什么意思&#xff1f; 淘宝天猫渠道会员购与淘宝天猫粉丝福利购意思基本相同&#xff0c;都可以领取淘宝天猫大额内部隐藏优惠券、通过草柴APP开通绑定渠道会员还可以获得购物返利。 草柴APP如何绑定开通淘宝天猫渠道会员&#xff1f; 1、手机下载安装「…

笔记二:odoo搜索、筛选和分组

一、搜索 1、xml代码 <!--搜索和筛选--><record id"view_search_book_message" model"ir.ui.view"><field name"name">book_message</field><field name"model">book_message</field><field…

“把握拐点,洞悉投资者情绪与比特币价格的未来之路!“

“本来这篇文章是昨天晚上发的&#xff0c;国庆节庆祝喝多了&#xff0c;心有余而力不足&#xff01;直接头躺马桶GG了” 标准普尔 500 指数 200 天移动平均线云是我几个月来一直分享的下行目标&#xff0c;上周正式重新测试了该目标。200 日移动平均线云表示为: 200 天指数移…

Linux(CentOS/Ubuntu)——安装nginx

如果确定你的系统是基于CentOS或RHEL&#xff0c;可以使用以下命令&#xff1a; ①、安装库文件 #安装gcc yum install gcc-c#安装PCRE pcre-devel yum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装Open SSL yum install -y openssl openssl-de…

【JVM】垃圾回收(GC)详解

垃圾回收&#xff08;GC&#xff09;详解 一. 死亡对象的判断算法1. 引用计数算法2. 可达性分析算法 二. 垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代算法 三. STW1. 为什么要 STW2. 什么情况下 STW 四. 垃圾收集器1. CMS收集器&#xff08;老年代收集器&…

React antd Table点击下一页后selectedRows丢失之前页选择内容的问题

一、问题 使用了React antd 的<Table>标签&#xff0c;是这样记录选中的行id与行内容的&#xff1a; <TabledataSource{data.list}rowSelection{{selectedRowKeys: selectedIdsInSearchTab,onChange: this.onSelectChange,}} // 表格是否可复选&#xff0c;加 type: …

cygwin编译haproxy

下载安装cygwin cygwin下载、安装-CSDN博客 编译haproxy 打开cygwin终端 下载程序 haproxy程序 OpenPKG Project: Download 输入下面命令下载程序 wget http://download.openpkg.org/components/cache/haproxy/haproxy-2.8.3.tar.gz 解压 tar -zxvf haproxy-2.8.3.tar.gz…

正则表达式的应用(前端写法)

文章目录 1、匹配字符串中&#xff0c;a标签的href值2、校验邮箱3、校验手机号码3、待添加... 1、匹配字符串中&#xff0c;a标签的href值 (1) 代码 /*** description 匹配字符串中&#xff0c;a标签的href值* param {string} str 匹配的字符串* return {Array} 返回href值*/…

OpenGLES:绘制一个彩色、旋转的3D立方体

一.概述 之前关于OpenGLES实战开发的博文&#xff0c;不论是实现相机滤镜还是绘制图形&#xff0c;都是在2D纬度 这篇博文开始&#xff0c;将会使用OpenGLES进入3D世界 本篇博文会实现一个颜色渐变、旋转的3D立方体 动态3D图形的绘制&#xff0c;需要具备一些基础的线性代数…

c++学习之优先级队列

目录 1.初识优先级队列 库中的实现 使用优先级队列 2.优先级队列的实现 3.仿函数 利用仿函数实现的优先级队列 迭代器区间构造&#xff08;建堆&#xff09; 1.初识优先级队列 如果我们给每个元素都分配一个数字来标记其优先级&#xff0c;不妨设较小的数字具有较…

国庆10.03

运算符重载 代码 #include <iostream> using namespace std; class Num { private:int num1; //实部int num2; //虚部 public:Num(){}; //无参构造Num(int n1,int n2):num1(n1),num2(n2){}; //有参构造~Num(){}; //析构函数const Num operator(const Num &other)co…

OpenGLES:绘制一个彩色、旋转的3D圆柱

一.概述 上一篇博文讲解了怎么绘制一个彩色旋转的立方体 这一篇讲解怎么绘制一个彩色旋转的圆柱 圆柱的顶点创建主要基于2D圆进行扩展&#xff0c;与立方体没有相似之处 圆柱绘制的关键点就是将圆柱拆解成&#xff1a;两个Z坐标不为0的圆 一个长方形的圆柱面 绘制2D圆的…

数据结构—归并排序-C语言实现

引言&#xff1a;归并排序跟快速排序一样&#xff0c;都运用到了分治的算法&#xff0c;但是归并排序是一种稳定的算法&#xff0c;同时也具备高效&#xff0c;其时间复杂度为O(N*logN) 算法图解&#xff1a; 然后开始归并&#xff1a; 就是这个思想&#xff0c;拆成最小子问题…

Vitamin K

各位 比对 机制 --Thermo --Mechanism of Action of Vitamin K Carboxylase (VKC).IV. Intermediates and Transition State-davis2007.pdf --Mechanism of Action of Vitamin K Carboxylase (VKC).IV. Intermediates and Transition State-davis2007.pdf -- 维生素K的作用…

Python实时采集Windows CPU\MEMORY\HDD使用率

文章目录 安装psutil库在Python脚本中导入psutil库获取CPU当前使用率&#xff0c;并打印结果获取内存当前使用率&#xff0c;并打印结果获取磁盘当前使用情况&#xff0c;并打印结果推荐阅读 要通过Python实时采集Windows性能计数器的数据&#xff0c;你可以使用psutil库。psut…

leetCode 376.摆动序列 贪心算法

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…