flutter ExpansionTile 層級(jí)菜單的實(shí)現(xiàn)
開發(fā)環(huán)境
- win10
- Android Studio
效果
用于多級(jí)菜單展示,或選擇。
如 每個(gè)省,市,縣;
如 樹木的病蟲害;
關(guān)鍵代碼
@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的使用
一般傳入三個(gè)參數(shù)
key,title,children;
- title:每一行上面的文字;
- children:菜單下面的子條目,是一個(gè)數(shù)組;
- key:根據(jù)源碼傳入PageStorageKey,用于保存滑動(dòng)過(guò)程中的狀態(tài);
2. 遞歸
有的條目有子條目,有的沒(méi)有,通過(guò)遞歸的方式遍歷出每條數(shù)據(jù);
通過(guò) bean.children.isEmpty 來(lái)結(jié)束遞歸;
如 “直轄市”中的北京,下面沒(méi)有 “市”了,也就是children.isEmpty,此時(shí)應(yīng)該結(jié)束遞歸,返回 ListTile;
如“省級(jí)行政單位” 下面的 “黑龍江”還有很多個(gè)“市”,還不需要繼續(xù)遍歷返回 層級(jí)菜單ExpansionTile;
3. 源碼
學(xué)習(xí)flutter,很多不了解的地方都可以試著看看對(duì)應(yīng)源碼上面的注釋。
/// 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 的源碼注釋。
粗略一看會(huì)發(fā)現(xiàn)幾個(gè)熟悉的字眼:ListView,ListTile
不錯(cuò),實(shí)現(xiàn)層級(jí)菜單的效果,需要搭配使用ListView與ListTile,
上面貼的關(guān)鍵代碼中 _buildItem()方法恰恰符合這一點(diǎn),
當(dāng)有子條目的時(shí)候返回ExpansionTile ,當(dāng)沒(méi)有子條目的時(shí)候返回 ListTile;
完整代碼--->gihub
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10vscode通過(guò)wifi調(diào)試真機(jī)的Flutter應(yīng)用的教程
這篇文章主要介紹了vscode通過(guò)wifi調(diào)試真機(jī)的Flutter應(yīng)用的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04讓Android中RadioGroup不顯示在輸入法上面的辦法
在Android開發(fā)中,發(fā)現(xiàn)一個(gè)問(wèn)題,打開輸入法導(dǎo)致下面的radioGroup的位置發(fā)生了變化,被頂?shù)搅溯斎敕ǖ纳厦?,那么該如何解決呢?下面來(lái)看看。2016-08-08android?studio實(shí)現(xiàn)上傳圖片到j(luò)ava服務(wù)器
這篇文章主要為大家詳細(xì)介紹了android?studio實(shí)現(xiàn)上傳圖片到j(luò)ava服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android新特性頁(yè)面之ViewPager拖拽到最后一頁(yè)再拖拽打開其他Activity(三種方法)
這篇文章主要介紹了Android新特性頁(yè)面之ViewPager拖拽到最后一頁(yè)再拖拽打開其他Activity的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Android應(yīng)用程序窗口(Activity)窗口對(duì)象(Window)創(chuàng)建指南
本文將詳細(xì)介紹Android應(yīng)用程序窗口(Activity)的窗口對(duì)象(Window)的創(chuàng)建過(guò)程,需要了解的朋友可以參考下2012-12-12