반응형

ListView는 Flutter에서 스크롤 가능한 리스트를 만들기 위해 사용하는 위젯입니다. 많은 데이터 항목을 스크롤 가능한 리스트로 표시할 때 매우 유용합니다. ListView는 여러 종류가 있으며, 각각의 용도에 맞게 사용될 수 있습니다.

 

 

일반 리스트뷰 샘플

body: ListView(
  children: [
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
          "title 1",
          style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
          ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    ),
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
        "title 1",
        style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
        ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    ),
    Container(
      padding: const EdgeInsets.all(10),
      child: const Text(
        "title 1",
        style: TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.bold
        ),
      ),
    ),
    Container(
      width: MediaQuery.of(context).size.width,
      height: 100,
      color: Colors.red,
    )
  ],
)

위와 같이 listview 의 children 에 여러개의 컴포넌트를 넣는다면 코드가 복잡해지기 때문에 하나의 컴포넌트로 만들필요가 있습니다. 

 

 

 

리스트 view 의 아이템을 컴포넌트 화 해보기

body: ListView(
  children: [
    postContainer(title: "title 1"),
    postContainer(title: "title 2", colorData: Colors.blue),
    postContainer(title: "title 3", colorData: Colors.green)
  ],
)
Widget postContainer({String title = '', Color colorData = Colors.red}) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Container(
        padding: const EdgeInsets.all(10),
        child: Text(
          title,
          style: const TextStyle(
              fontSize: 30,
              fontWeight: FontWeight.bold
          ),
        ),
      ),
      Container(
        width: MediaQuery.of(context).size.width,
        height: 100,
        color: colorData,
      )
    ],
  );
}

 

title 과 color 를 변수로 사용할 수 있습니다. 

 

만약 가로 스크롤을 원한다면 scrollDirection 을 변경해주면 됩니다.

body: ListView(
  scrollDirection: Axis.horizontal,



ListView.Builder 

final postList = [
  {
    "title" : "Sample title 1" ,
    "color" : Colors.blue
  },
  {
    "title" : "Sample title 2" ,
    "color" : Colors.greenAccent
  },
  {
    "title" : "Sample title 3" ,
    "color" : Colors.lime
  },
  {
    "title" : "Sample title 4" ,
    "color" : Colors.blue
  },
  {
    "title" : "Sample title 5" ,
    "color" : Colors.green
  },
  {
    "title" : "Sample title 6" ,
    "color" : Colors.yellow
  },
  {
    "title" : "Sample title 7" ,
    "color" : Colors.red
  },
];

위와 같은 데이터가 선언되어 있을 때 ListView.builder 를 사용하여 쉽게 구현할 수 있습니다. 

itemCount 및 itemBuilder 속성을 통하여 list data 를 노출할 수 있습니다.

body: ListView.builder(
    itemCount: postList.length,
    itemBuilder: (BuildContext con, int index)  {
      return postContainer(
          title: postList[index]["title"] as String,
          colorData: postList[index]["color"] as Color
      );
    }
)

 


다른 예시

기본 ListView 

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Basic ListView'),
        ),
        body: ListView(
          padding: EdgeInsets.all(8.0),
          children: <Widget>[
            ListTile(
              title: Text('Item 1'),
            ),
            ListTile(
              title: Text('Item 2'),
            ),
            ListTile(
              title: Text('Item 3'),
            ),
          ],
        ),
      ),
    );
  }
}

 

ListView.builder

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ListView.builder Example'),
        ),
        body: ListView.builder(
          itemCount: 20,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}

 

주요 속성

children: 리스트에 표시할 위젯 목록을 지정합니다 (ListView).

itemCount: 리스트 항목의 개수를 지정합니다 (ListView.builder, ListView.separated).

itemBuilder: 각 항목을 빌드하는 함수입니다 (ListView.builder, ListView.separated).

separatorBuilder: 항목 사이에 구분자를 빌드하는 함수입니다 (ListView.separated).

scrollDirection: 리스트의 스크롤 방향을 지정합니다. 기본값은 Axis.vertical입니다.

padding: 리스트의 패딩을 지정합니다.

reverse: 스크롤 방향을 반대로 설정할지 여부를 지정합니다. 기본값은 false입니다.



ListView 문서

 

ListView 클래스 문서

ListView.builder 클래스 문서

ListView.separated 클래스 문서

ListView.custom 클래스 문서

반응형

+ Recent posts