[flutter] ExpansionPanelList에서 패널 확장/축소 애니메이션 지연 설정 방법

ExpansionPanelList 위젯은 패널을 확장하거나 축소하는 동적인 UI를 만들 때 유용한 위젯입니다. 하지만 기본적으로 패널의 확장 및 축소 애니메이션은 즉시 발생하게 되어 있습니다. 이번 기술 블로그에서는 ExpansionPanelList에서 패널 확장 및 축소 애니메이션을 지연시키는 방법을 알려드리겠습니다.

패널 확장/축소 애니메이션 지연 설정 방법

ExpansionPanelList에서 패널 확장/축소 애니메이션을 지연시키기 위해서는 ExpansionPanelList 위젯의 expansionCallback 속성을 활용해야 합니다. expansionCallback은 패널이 확장/축소될 때 호출되는 콜백 함수입니다.

아래는 ExpansionPanelList에서 패널 확장/축소 애니메이션을 지연시키는 예시 코드입니다.

import 'package:flutter/material.dart';

class CustomExpansionPanelList extends StatefulWidget {
  @override
  _CustomExpansionPanelListState createState() => _CustomExpansionPanelListState();
}

class _CustomExpansionPanelListState extends State<CustomExpansionPanelList> {
  List<Item> _items = [
    Item(
      headerValue: '패널 1',
      expandedValue: '패널 1 확장 뷰입니다.',
      isExpanded: false,
    ),
    Item(
      headerValue: '패널 2',
      expandedValue: '패널 2 확장 뷰입니다.',
      isExpanded: false,
    ),
    Item(
      headerValue: '패널 3',
      expandedValue: '패널 3 확장 뷰입니다.',
      isExpanded: false,
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Container(
        child: ExpansionPanelList(
          elevation: 1,
          expandedHeaderPadding: EdgeInsets.zero,
          expansionCallback: (int index, bool isExpanded) {
            setState(() {
              _items[index].isExpanded = !isExpanded;
            });
            Future.delayed(Duration(milliseconds: 300), () {
              _updatePanelVisibility(index);
            });
          },
          children: _items.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(),
        ),
      ),
    );
  }

  void _updatePanelVisibility(int index) {
    setState(() {
      _items[index].isVisible = !_items[index].isVisible;
    });
  }
}

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

  final String headerValue;
  final String expandedValue;
  bool isExpanded;
}

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: CustomExpansionPanelList(),
    ),
  ));
}

위의 코드에서는 ExpansionPanelList 위젯을 사용하여 패널을 확장/축소하는 동적인 UI를 만들었습니다. expansionCallback 내에서는 패널의 확장/축소 상태를 업데이트하고 지연된 시간(Duration(milliseconds: 300)) 이후에 _updatePanelVisibility 함수를 호출하여 패널의 가시성을 업데이트합니다.

이제 ExpansionPanelList 위젯을 사용하여 패널 확장/축소 애니메이션을 지연시킬 수 있는 방법을 알아보았습니다. 이를 활용하여 동적인 UI를 더욱 효과적으로 구현할 수 있습니다.

참고 문서: