基于ExpansionTile实现可展开的列表

566 阅读1分钟

一 认识ExpansionTile

const ExpansionTile({
Key key,
this.leading,//标题左侧要展示的widget
@required this.title, //要展示的标题widget
this.backgroudColor,//背景
this.onExpansionChanged,//列表展开收起的回调函数
this.children = const [],//列表展开时显示的widget
this.trailing,//标题右侧要展示的widget 即图标
this.initiallyExpanded=false,// 默认情况下是否展开
})

二 展示列表需要的因素

import 'package:flutter/material.dart';

void main()=>runApp(MyApp());

const CITY_NAMES ={
'北京':['东城区','西城区','昌平区','朝阳区','海淀区','顺义','石景山区','丰台区'],
'上海':['黄浦区','徐汇区','长宁区','静安区','普陀区','闸北区','虹口区'],
'广州':['越秀','海珠','荔湾','天河','白云','黄埔','南沙'],
'深圳':['南山','福田','罗湖','盐田','龙岗','宝安','龙华'],
'杭州':['上城区','下城区','江干区','拱墅区','西湖区','滨江区'],
'苏州':['姑苏区','吴中区','相城区','高新区','虎丘区','工业园区','吴江区'],

};

class MyApp extends StatelessWidget{
final title ='列表展开与收起';
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(title: Text(title)),
body: Container(
child:ListView(
children: _buildList(),
),
),
),

);
}

}
List _buildList() {
List widgets =[];
CITY_NAMES.keys.forEach((key){
widgets.add(_item(key,CITY_NAMES[key]));
});

return widgets;

}

Widget _item(String city, List city_names) {
return ExpansionTile(
title: Text(
city,
style: TextStyle(fontSize: 20,color: Colors.black54),
),
children: city_names.map((subcity)=>_buildSub(subcity)).toList(),

);
}

Widget _buildSub(String subcity) {
return FractionallySizedBox(
widthFactor: 1,
child: Container(
height: 50,
alignment: Alignment.centerLeft,
margin: EdgeInsets.only(bottom: 5),
decoration: BoxDecoration(color: Colors.lightBlueAccent),
child: Text(subcity),
),

);

}