一統天下 flutter - widget 列表類: ExpansionPanelList - 可展開列表

源碼 https://github.com/webabcd/flutter_demo
作者 webabcd

一統天下 flutter - widget 列表類: ExpansionPanelList - 可展開列表

示例如下:

lib\widget\list\expansion_panel_list.dart

/*
 * ExpansionPanelList - 可展開列表
 *
 * ExpansionPanelList 中的每一項是 ExpansionPanel
 * 點擊 ExpansionPanel 的 header 後就會顯示或隱藏 ExpansionPanel 的 body
 */

import 'package:flutter/material.dart';

import '../../helper.dart';

class ExpansionPanelListDemo extends StatefulWidget {
  const ExpansionPanelListDemo({Key? key}) : super(key: key);

  @override
  _ExpansionPanelListDemoState createState() => _ExpansionPanelListDemoState();
}

class _ExpansionPanelListDemoState extends State<ExpansionPanelListDemo> {

  final List<_MyItem> _dataList = _MyItem.generateItems(8);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("title")),
      backgroundColor: Colors.orange,
      /// ExpansionPanelList 是不可滾動的,如需滾動則可以在外面加一層 SingleChildScrollView
      body: SingleChildScrollView(
        physics: const BouncingScrollPhysics(),
        child: ExpansionPanelList(
          /// 展開/收縮動畫的時長
          animationDuration: const Duration(milliseconds: 500),
          /// 展開後,header 的內邊距
          expandedHeaderPadding: const EdgeInsets.all(10),
          /// 分隔線的顏色
          dividerColor: Colors.green,
          /// 展開/收縮之後的回調
          expansionCallback: (int index, bool isExpanded) {
            setState(() {
              _dataList[index].isExpanded = !isExpanded;
            });
          },
          /// 構造列表中的每一個可展開項
          children: _dataList.map<ExpansionPanel>((_MyItem item) {
            return ExpansionPanel(
              /// 背景
              backgroundColor: Colors.red,
              /// 點擊 header 後是否觸發展開/收縮(如果設置爲 false 則只有點擊 header 右側的小三角才能觸發展開/收縮)
              canTapOnHeader: true,
              /// header(點擊 header 則顯示或隱藏 body)
              headerBuilder: (BuildContext context, bool isExpanded) {
                return Align(
                  alignment: Alignment.centerLeft,
                  child: MyTextSmall(item.headerValue),
                );
              },
              /// body(點擊 header 則顯示或隱藏 body)
              body: Container(
                width: double.infinity,
                height: 200,
                alignment: Alignment.center,
                color: Colors.blue,
                child: MyText(item.bodyValue),
              ),

              /// 是否是展開狀態
              isExpanded: item.isExpanded,
            );
          }).toList(),
        ),
      ),
    );
  }
}

class _MyItem {
  _MyItem({
    required this.bodyValue,
    required this.headerValue,
    this.isExpanded = false,
  });

  String bodyValue;
  String headerValue;
  bool isExpanded;

  static List<_MyItem> generateItems(int numberOfItems) {
    return List<_MyItem>.generate(numberOfItems, (int index) {
      return _MyItem(
        headerValue: 'header $index',
        bodyValue: 'body $index',
      );
    });
  }
}



源碼 https://github.com/webabcd/flutter_demo
作者 webabcd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章