728x90

Flutter 앱을 개발하면서 가장 자주 사용 되는 UI 요소 중 하나가 바로 스크롤 가능한 리스트, ListView 입니다.

📌 ListView란?

ListView는 Flutter에서 수직 혹은 수평으로 스크롤 가능한 리스트 뷰를 제공하는 위젯 입니다. 빌더 패턴을 활용해 동적으로 아이템을 생성할 수 있습니다.

🧱 ListView의 주요 생성자

1. ListView()

  • 고정된 children 리스트를 직접 전달.
    • 단점: 많은 항목이 있으면 성능 저하 발생 (모든 위젯을 메모리에 생성)
ListView(
  children: [
    Text('Item 1'),
    Text('Item 2'),
    Text('Item 3'),
  ],
)

(결과)

2. ListView.builder()

  • 스크롤할 때마다 위젯을 생성하는 방식으로 성능에 유리.
  • 항목이 많거나 동적으로 생성되는 경우에 필수.
ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(title: Text('Item $index'));
  },
)

(결과)

3. ListView.separated()

  • 각 항목 사이에 구분선이나 위젯을 넣고 싶을 때 사용.
ListView.separated(
  itemCount: 10,
  itemBuilder: (context, index) => ListTile(title: Text('Item $index')),
  separatorBuilder: (context, index) => Divider(), // 구분선
)

(결과)

4. ListView.custom()

  • 고급 커스터마이징이 필요한 경우 사용.
  • SliverChildDelegate를 통해 직접 동작 방식 정의 가능.

📏 주요 속성

속성 설명
scrollDirection 기본은 Axis.vertical. 수평 스크롤은 Axis.horizontal로 설정
reverse true로 설정 시 리스트의 순서를 반대로
controller 스크롤을 제어하기 위한 ScrollController 연결
shrinkWrap true로 설정하면 남은 공간만 차지 (Nested Scroll 시 유용)
physics 스크롤 동작 제어 (BouncingScrollPhysics, NeverScrollableScrollPhysics 등)

🧠 주의할 점 & 팁

✅ 성능 최적화

  • 많은 항목이 있을 경우에는 반드시 ListView.builder() 사용.
  • shrinkWrap: true는 필요한 경우에만, 일반 상황에선 성능 저하 가능 (예: 다른 스크롤 뷰 안에 ListView 포함할 때).
  • physics: NeverScrollableScrollPhysics() 로 스크롤 비활성화 가능.

✅ 자동 스크롤 위치 유지

  • controller를 사용해 스크롤 위치 제어 가능.
    • 예: ScrollController, jumpTo(), animateTo() 등 활용.
728x90
반응형

'Language > Flutter' 카테고리의 다른 글

(Flutter) ElevatedButton Class  (0) 2025.04.03
(Flutter) Scaffold class  (0) 2025.03.25

+ Recent posts