Ahmet Balaman LogoAhmet Balaman

Flutter: ListView Widget Kullanımı

personAhmet Balaman
calendar_today
FlutterListViewWidgetUIListScroll

ListView, Flutter'da kaydırılabilir listeler oluşturmak için kullanılan temel widget'tır. Dikey veya yatay olarak sıralı öğeler oluşturmanızı sağlar. Listeleme işlemlerinde en sık kullanılan widget'lardan biridir.

Canlı Demo

Aşağıdaki interaktif örnekte bu widget'ı deneyebilirsiniz:

💡 Eğer yukarıdaki örnek açılmazsa, DartPad linkine tıklayarak yeni sekmede çalıştırabilirsiniz.

Temel Kullanım

ListView(
  children: [
    Text('Öğe 1'),
    Text('Öğe 2'),
    Text('Öğe 3'),
  ],
)

Önemli Özellikler

Özellik Açıklama
scrollDirection Kaydırma yönü (dikey/yatay)
padding Liste içi boşluk
reverse Ters sıralama
physics Kaydırma davranışı
shrinkWrap Boyut sığdırma
itemExtent Sabit öğe yüksekliği

ListTile ile Klasik Kullanım

ListView(
  children: [
    ListTile(
      leading: Icon(Icons.person),
      title: Text('Kullanıcı Adı'),
      subtitle: Text('Alt başlık'),
      trailing: Icon(Icons.chevron_right),
      onTap: () {},
    ),
    ListTile(
      leading: Icon(Icons.email),
      title: Text('E-posta'),
      subtitle: Text('[email protected]'),
      trailing: Icon(Icons.chevron_right),
    ),
  ],
)

Özel Satır Tasarımı (ListTile Dışında)

ListTile dışında farklı satır tasarımları da yapabilirsiniz:

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('Özel Başlık', style: TextStyle(fontWeight: FontWeight.bold)),
                Text('Özel alt başlık metni'),
              ],
            ),
          ),
          IconButton(
            icon: Icon(Icons.favorite_border),
            onPressed: () {},
          ),
        ],
      ),
    ),
  ],
)

Yatay ListView

scrollDirection özelliği ile listeleri yatay olarak sıralayabilirsiniz:

Container(
  height: 120, // Yatay liste için sabit yükseklik gerekli
  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')),
      ),
    ],
  ),
)

ListView.builder ile Dinamik Listeleme

Dinamik olarak liste oluşturmak için .builder alt sınıfından yararlanılır. Bu yöntem, büyük listelerde performans açısından çok önemlidir çünkü sadece ekranda görünen öğeleri oluşturur:

ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(
      leading: CircleAvatar(child: Text('$index')),
      title: Text('Öğe $index'),
      subtitle: Text('Bu öğenin açıklaması'),
    );
  },
)

ListView.builder ile Özel Tasarım

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('Detay'),
            ),
          ],
        ),
      ),
    );
  },
)

ListView.separated ile Ayırıcılı Liste

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

Kaydırma Kontrolü

final ScrollController _scrollController = ScrollController();

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

// Listeyi en üste kaydır
_scrollController.animateTo(
  0,
  duration: Duration(milliseconds: 500),
  curve: Curves.easeInOut,
);

Özet

  • ListView: Temel kaydırılabilir liste widget'ı
  • scrollDirection: Yatay veya dikey kaydırma
  • ListView.builder: Dinamik ve performanslı listeleme
  • ListView.separated: Ayırıcılı listeler
  • ListTile: Standart liste öğesi
  • Özel tasarımlar: Container, Card ile farklı satır tasarımları

ListView, Flutter'da listeleme işlemlerinin temel yapı taşıdır ve farklı senaryolara uygun çeşitli alt sınıflar sunar.

Yorumlar