展开收起之ExpansionTile

先来看看ExpansionTile的传参:

ExpansionTile({
  Key key,
  this.leading, // 左侧icon
  @required this.title, //  标题必传
  this.backgroundColor, // 背景色
  this.onExpansionChanged, // 展开收起监听时间
  this.children = const <Widget>[], //子元素
  this.trailing, // 右侧icon
  this.initiallyExpanded = false // 初始状态是否展开
})

具体实现:

import 'package:flutter/material.dart';

const CITY_NAMES = {
  '北京': ['丰台', '西城', '东城', '顺义'],
  '上海': ['普陀', '松江', '黄埔', '长宁'],
  '广州': ['越秀', '珠海', '白云', '天河']
};

class MyExpansionTile extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    const title = '列表展开与收起';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        body: Container(
          child: ListView(
            children: _buildList(),
          ),
        ),
      ),
    );
  }

  List<Widget> _buildList() {
    List<Widget> widgets = [];
    for (var key in CITY_NAMES.keys) {
      widgets.add(_item(key, CITY_NAMES[key]!));
    }
    return widgets;
  }

  Widget _item(String city, List<String> cityNames) {
    return ExpansionTile(
      title: Text(
        city,
        style: const TextStyle(color: Colors.amber, fontSize: 20),
      ),
      children: cityNames.map((cityName) => _buildSub(cityName)).toList(),
    );
  }

  Widget _buildSub(String cityName) {
    return FractionallySizedBox(
      widthFactor: 1,
      child: Container(
        height: 40,
        margin: const EdgeInsets.only(bottom: 4),
        decoration: BoxDecoration(color: Colors.green[600]),
        child: Text(cityName),
      ),
    );
  }
}

小结

这个widget的功能和element的Collapse的基本没啥区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容