Ahmet Balaman LogoAhmet Balaman

Flutter: ListView Widget Usage

personAhmet Balaman
calendar_today
FlutterListViewWidgetUIListScroll

ListView is the fundamental widget for creating scrollable lists in Flutter. It allows you to create items arranged vertically or horizontally. It's one of the most frequently used widgets for listing operations.

Live Demo

You can try this widget in the interactive example below:

💡 If the example above doesn't load, click DartPad to run it in a new tab.

Basic Usage

ListView(
  children: [
    Text('Item 1'),
    Text('Item 2'),
    Text('Item 3'),
  ],
)

Important Properties

Property Description
scrollDirection Scroll direction (vertical/horizontal)
padding Inner padding
reverse Reverse order
physics Scroll behavior
shrinkWrap Size fitting
itemExtent Fixed item height

Classic Usage with ListTile

ListView(
  children: [
    ListTile(
      leading: Icon(Icons.person),
      title: Text('Username'),
      subtitle: Text('Subtitle'),
      trailing: Icon(Icons.chevron_right),
      onTap: () {},
    ),
    ListTile(
      leading: Icon(Icons.email),
      title: Text('Email'),
      subtitle: Text('[email protected]'),
      trailing: Icon(Icons.chevron_right),
    ),
  ],
)

Custom Row Design (Beyond ListTile)

You can create different row designs besides ListTile:

ListView(
  padding: EdgeInsets.all(8),
  children: [
    Container(
      padding: EdgeInsets.all(16),
      margin: EdgeInsets.only(bottom: 8),
      decoration: BoxDecoration(
        color: Colors.blue.shade50,
        borderRadius: BorderRadius.circular(12),
        border: Border.all(color: Colors.blue),
      ),
      child: Row(
        children: [
          CircleAvatar(
            backgroundColor: Colors.blue,
            child: Icon(Icons.star, color: Colors.white),
          ),
          SizedBox(width: 16),
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('Custom Title', style: TextStyle(fontWeight: FontWeight.bold)),
                Text('Custom subtitle text'),
              ],
            ),
          ),
          IconButton(
            icon: Icon(Icons.favorite_border),
            onPressed: () {},
          ),
        ],
      ),
    ),
  ],
)

Horizontal ListView

You can arrange lists horizontally using the scrollDirection property:

Container(
  height: 120, // Fixed height required for horizontal list
  child: ListView(
    scrollDirection: Axis.horizontal,
    children: [
      Container(
        width: 100,
        margin: EdgeInsets.all(8),
        color: Colors.red,
        child: Center(child: Text('1')),
      ),
      Container(
        width: 100,
        margin: EdgeInsets.all(8),
        color: Colors.green,
        child: Center(child: Text('2')),
      ),
      Container(
        width: 100,
        margin: EdgeInsets.all(8),
        color: Colors.blue,
        child: Center(child: Text('3')),
      ),
    ],
  ),
)

Dynamic Listing with ListView.builder

The .builder subclass is used for dynamic list creation. This method is very important for performance in large lists because it only creates visible items:

ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(
      leading: CircleAvatar(child: Text('$index')),
      title: Text('Item $index'),
      subtitle: Text('Description of this item'),
    );
  },
)

Custom Design with ListView.builder

final List<Map<String, dynamic>> items = [
  {'title': 'Flutter', 'icon': Icons.flutter_dash, 'color': Colors.blue},
  {'title': 'Dart', 'icon': Icons.code, 'color': Colors.teal},
  {'title': 'Firebase', 'icon': Icons.cloud, 'color': Colors.orange},
];

ListView.builder(
  itemCount: items.length,
  padding: EdgeInsets.all(16),
  itemBuilder: (context, index) {
    final item = items[index];
    return Card(
      margin: EdgeInsets.only(bottom: 12),
      child: Padding(
        padding: EdgeInsets.all(16),
        child: Row(
          children: [
            Icon(item['icon'], size: 40, color: item['color']),
            SizedBox(width: 16),
            Expanded(child: Text(item['title'], style: TextStyle(fontSize: 18))),
            ElevatedButton(
              onPressed: () {},
              child: Text('Details'),
            ),
          ],
        ),
      ),
    );
  },
)

ListView.separated with Dividers

ListView.separated(
  itemCount: 10,
  separatorBuilder: (context, index) => Divider(
    color: Colors.grey,
    height: 1,
  ),
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('Item $index'),
    );
  },
)

Scroll Control

final ScrollController _scrollController = ScrollController();

ListView.builder(
  controller: _scrollController,
  itemCount: 50,
  itemBuilder: (context, index) => ListTile(title: Text('Item $index')),
)

// Scroll list to top
_scrollController.animateTo(
  0,
  duration: Duration(milliseconds: 500),
  curve: Curves.easeInOut,
);

Summary

  • ListView: Basic scrollable list widget
  • scrollDirection: Horizontal or vertical scrolling
  • ListView.builder: Dynamic and performant listing
  • ListView.separated: Lists with dividers
  • ListTile: Standard list item
  • Custom designs: Different row designs with Container, Card

ListView is the building block of listing operations in Flutter and offers various subclasses suitable for different scenarios.

Comments