flutter ExpansionTile 层级菜单的实现
时间:2022-07-27
本文章向大家介绍flutter ExpansionTile 层级菜单的实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开发环境
- win10
- Android Studio
效果
用于多级菜单展示,或选择。
如 每个省,市,县;
如 树木的病虫害;
关键代码
@override
Widget build(BuildContext context) {
return ListTile(
title: _buildItem(widget.bean),
);
}
Widget _buildItem(NameBean bean){
if(bean.children.isEmpty){
return ListTile(
title: Text(bean.name),
onTap: (){
_showSeletedName(bean.name);
},
);
}
return ExpansionTile(
key: PageStorageKey<NameBean (bean),
title: Text(bean.name),
children: bean.children.map<Widget (_buildItem).toList(),
leading: CircleAvatar(
backgroundColor: Colors.green,
child: Text(bean.name.substring(0,1),style: TextStyle(color: Colors.white),),
),
);
}
分析
- api:ExpansionTile
- 算法:递归
1. ExpansionTile的使用
一般传入三个参数
key,title,children;
- title:每一行上面的文字;
- children:菜单下面的子条目,是一个数组;
- key:根据源码传入PageStorageKey,用于保存滑动过程中的状态;
2. 递归
有的条目有子条目,有的没有,通过递归的方式遍历出每条数据;
通过 bean.children.isEmpty 来结束递归; 如 “直辖市”中的北京,下面没有 “市”了,也就是children.isEmpty,此时应该结束递归,返回 ListTile; 如“省级行政单位” 下面的 “黑龙江”还有很多个“市”,还不需要继续遍历返回 层级菜单ExpansionTile;
3. 源码
学习flutter,很多不了解的地方都可以试着看看对应源码上面的注释。
/// A single-line [ListTile] with a trailing button that expands or collapses
/// the tile to reveal or hide the [children].
///
/// This widget is typically used with [ListView] to create an
/// "expand / collapse" list entry. When used with scrolling widgets like
/// [ListView], a unique [PageStorageKey] must be specified to enable the
/// [ExpansionTile] to save and restore its expanded state when it is scrolled
/// in and out of view.
///
/// See also:
///
/// * [ListTile], useful for creating expansion tile [children] when the
/// expansion tile represents a sublist.
/// * The "Expand/collapse" section of
/// <https://material.io/guidelines/components/lists-controls.html .
class ExpansionTile extends StatefulWidget {
上面一段是 ExpansionTile 的源码注释。 粗略一看会发现几个熟悉的字眼:ListView,ListTile 不错,实现层级菜单的效果,需要搭配使用ListView与ListTile, 上面贴的关键代码中 _buildItem()方法恰恰符合这一点, 当有子条目的时候返回ExpansionTile ,当没有子条目的时候返回 ListTile;
完整代码— gihub
以上就是本文的全部内容,希望对大家的学习有所帮助。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vuedraggable实现列表拖动排序
- 在 Xcode 中添加 Swift package 依赖
- 浅谈JavaScript中的apply,call和bind
- Git 的简单使用
- 移动端适配
- 《Algorithms Unlocked》读书笔记1——循环和递归
- 《Algorithms Unlocked》读书笔记2——二分查找和排序算法
- 《Algorithms Unlocked》读书笔记3——计数排序
- vue-element-admin
- 二叉树的递归算法
- mongoDB基本操作
- 一个 Vue + Node + MongoDB 博客系统
- promise 和 async 的用法
- 解决 iPhone 微信 H5 无法自动播放音乐问题
- Sequelize 基本操作