[flutter] 플러터 ExpansionPanel 위젯 사용 방법

플러터에서 ExpansionPanel 위젯은 접혀진 상태에서 확장되는 패널을 만들어주는 유용한 위젯입니다. 이 위젯은 UI에서 리스트나 그룹을 사용자에게 축소하거나 확장하는 데 사용됩니다. 이 글에서는 플러터에서 ExpansionPanel 위젯을 사용하는 방법에 대해 알아보겠습니다.

ExpansionPanel 위젯 설치

ExpansionPanel 위젯은 기본 플러터 패키지에 포함되어 있으므로 별도의 설치 없이 사용할 수 있습니다.

ExpansionPanel 위젯 사용법

ExpansionPanel 위젯은 ExpansionPanelList 위젯과 함께 사용됩니다. ExpansionPanel 위젯은 ExpansionPanelList의 자식 위젯으로 사용되어야 합니다.

ExpansionPanelList(
  expansionCallback: (int index, bool isExpanded) {
    setState(() {
      // 패널 상태를 변경합니다.
      data[index].isExpanded = !isExpanded;
    });
  },
  children: data.map<ExpansionPanel>((Item item) {
    return ExpansionPanel(
      headerBuilder: (BuildContext context, bool isExpanded) {
        return ListTile(
          title: Text(item.headerValue),
        );
      },
      body: ListTile(
        title: Text(item.expandedValue),
      ),
      isExpanded: item.isExpanded,
    );
  }).toList(),
)

ExpansionPanelList는 expansionCallback 콜백 함수를 제공하여 패널이 확장되는지 축소되는지에 대한 상태를 관리합니다. 각 ExpansionPanel 위젯은 headerBuilder와 body를 사용하여 헤더와 본문을 구성합니다. isExpanded 속성을 사용하여 패널의 현재 확장 상태를 지정할 수 있습니다.

ExpansionPanel 위젯 사용 예시

아래 예제는 ExpansionPanel 위젯을 사용하여 리스트의 아이템을 축소 및 확장하는 예시입니다.

class Item {
  Item({
    required this.expandedValue,
    required this.headerValue,
    this.isExpanded = false,
  });

  String expandedValue;
  String headerValue;
  bool isExpanded;
}

List<Item> generateItems(int numberOfItems) {
  return List<Item>.generate(numberOfItems, (int index) {
    return Item(
      headerValue: '패널 $index',
      expandedValue: '패널 $index의 본문',
    );
  });
}

class MyExpansionPanel extends StatefulWidget {
  @override
  _MyExpansionPanelState createState() => _MyExpansionPanelState();
}

class _MyExpansionPanelState extends State<MyExpansionPanel> {
  List<Item> _data = generateItems(5);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Expansion Panel 예시'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: ExpansionPanelList(
              expansionCallback: (int index, bool isExpanded) {
                setState(() {
                  _data[index].isExpanded = !isExpanded;
                });
              },
              children: _data.map<ExpansionPanel>((Item item) {
                return ExpansionPanel(
                  headerBuilder: (BuildContext context, bool isExpanded) {
                    return ListTile(
                      title: Text(item.headerValue),
                    );
                  },
                  body: ListTile(
                    title: Text(item.expandedValue),
                  ),
                  isExpanded: item.isExpanded,
                );
              }).toList(),
            ),
          ),
        ),
      ),
    );
  }
}

결론

플러터에서 ExpansionPanel 위젯은 리스트나 그룹을 축소하거나 확장하기 위한 간편한 방법을 제공합니다. 위젯을 사용하여 사용자 경험을 증진시킬 수 있으며, 플러터 앱에서 공간을 절약하는 데 도움이 됩니다. 이 글을 통해 ExpansionPanel 위젯의 사용법을 익혀보세요.