Widgets

CollectionView

Giriş

CollectionView widget'ı, Nylo Website projelerinizde veri listelerini görüntülemek için güçlü, tip güvenli bir sarıcıdır. ListView, ListView.separated ve grid düzenleri ile çalışmayı kolaylaştırırken şunlar için yerleşik destek sağlar:

  • Otomatik yükleme durumları ile asenkron veri yükleme
  • Çekerek yenileme ve sayfalama
  • Konum yardımcıları ile tip güvenli öğe oluşturucular
  • Boş durum yönetimi
  • Veri sıralama ve dönüştürme

Temel Kullanım

Öğe listesi görüntüleyen basit bir örnek:

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: CollectionView<String>(
      data: () => ['Item 1', 'Item 2', 'Item 3'],
      builder: (context, item) {
        return ListTile(
          title: Text(item.data),
        );
      },
    ),
  );
}

API'den asenkron veri ile:

CollectionView<Todo>(
  data: () async {
    return await api<ApiService>((request) =>
      request.get('https://jsonplaceholder.typicode.com/todos')
    );
  },
  builder: (context, item) {
    return ListTile(
      title: Text(item.data.title),
      subtitle: Text(item.data.completed ? 'Done' : 'Pending'),
    );
  },
)

CollectionItem Yardımcısı

builder callback'i, verilerinizi kullanışlı konum yardımcıları ile saran bir CollectionItem<T> nesnesi alır:

CollectionView<String>(
  data: () => ['First', 'Second', 'Third', 'Fourth'],
  builder: (context, item) {
    return Container(
      color: item.isEven ? Colors.grey[100] : Colors.white,
      child: ListTile(
        title: Text('${item.data} (index: ${item.index})'),
        subtitle: Text('Progress: ${(item.progress * 100).toInt()}%'),
      ),
    );
  },
)

CollectionItem Özellikleri

Özellik Tür Açıklama
data T Gerçek öğe verisi
index int Listedeki mevcut indeks
totalItems int Toplam öğe sayısı
isFirst bool İlk öğe ise true
isLast bool Son öğe ise true
isOdd bool İndeks tek sayı ise true
isEven bool İndeks çift sayı ise true
progress double Liste içindeki ilerleme (0.0 - 1.0)

CollectionItem Metotları

Metot Açıklama
isAt(int position) Öğenin belirli bir konumda olup olmadığını kontrol eder
isInRange(int start, int end) İndeksin aralık içinde olup olmadığını kontrol eder (dahil)
isMultipleOf(int divisor) İndeksin bölenın katı olup olmadığını kontrol eder

CollectionView

Varsayılan kurucu standart bir liste görünümü oluşturur:

CollectionView<Map<String, dynamic>>(
  data: () async {
    return [
      {"title": "Clean Room"},
      {"title": "Go shopping"},
      {"title": "Buy groceries"},
    ];
  },
  builder: (context, item) {
    return ListTile(title: Text(item.data['title']));
  },
  spacing: 8.0, // Add spacing between items
  padding: EdgeInsets.all(16),
)

CollectionView.separated

Öğeler arasında ayırıcıları olan bir liste oluşturur:

CollectionView<User>.separated(
  data: () async => await fetchUsers(),
  builder: (context, item) {
    return ListTile(
      title: Text(item.data.name),
      subtitle: Text(item.data.email),
    );
  },
  separatorBuilder: (context, index) {
    return Divider(height: 1);
  },
)

CollectionView.grid

Kademeli grid kullanarak bir grid düzeni oluşturur:

CollectionView<Product>.grid(
  data: () async => await fetchProducts(),
  builder: (context, item) {
    return ProductCard(product: item.data);
  },
  crossAxisCount: 2,
  mainAxisSpacing: 8.0,
  crossAxisSpacing: 8.0,
  padding: EdgeInsets.all(16),
)

CollectionView.pullable

Çekerek yenileme ve sonsuz kaydırma sayfalaması ile bir liste oluşturur:

CollectionView<Post>.pullable(
  data: (int iteration) async {
    // iteration starts at 1 and increments on each load
    return await api<ApiService>((request) =>
      request.get('/posts?page=$iteration')
    );
  },
  builder: (context, item) {
    return PostCard(post: item.data);
  },
  onRefresh: () {
    print('List was refreshed!');
  },
  headerStyle: 'WaterDropHeader', // Pull indicator style
)

Başlık Stilleri

headerStyle parametresi şunları kabul eder:

  • 'WaterDropHeader' (varsayılan) - Su damlası animasyonu
  • 'ClassicHeader' - Klasik çekme göstergesi
  • 'MaterialClassicHeader' - Material tasarım stili
  • 'WaterDropMaterialHeader' - Material su damlası
  • 'BezierHeader' - Bezier eğri animasyonu

Sayfalama Callback'leri

Callback Açıklama
beforeRefresh Yenileme başlamadan önce çağrılır
onRefresh Yenileme tamamlandığında çağrılır
afterRefresh Veri yüklendikten sonra çağrılır, dönüştürme için veri alır

CollectionView.pullableSeparated

Çekerek yenilemeyi ayırıcılı liste ile birleştirir:

CollectionView<Message>.pullableSeparated(
  data: (iteration) async => await fetchMessages(page: iteration),
  builder: (context, item) {
    return MessageTile(message: item.data);
  },
  separatorBuilder: (context, index) => Divider(),
)

CollectionView.pullableGrid

Çekerek yenilemeyi grid düzeni ile birleştirir:

CollectionView<Photo>.pullableGrid(
  data: (iteration) async => await fetchPhotos(page: iteration),
  builder: (context, item) {
    return Image.network(item.data.url);
  },
  crossAxisCount: 3,
  mainAxisSpacing: 4,
  crossAxisSpacing: 4,
)

Yükleme Stilleri

loadingStyle kullanarak yükleme göstergesini özelleştirin:

// Normal loading with custom widget
CollectionView<Item>(
  data: () async => await fetchItems(),
  builder: (context, item) => ItemTile(item: item.data),
  loadingStyle: LoadingStyle.normal(
    child: Text("Loading items..."),
  ),
)

// Skeletonizer loading effect
CollectionView<User>(
  data: () async => await fetchUsers(),
  builder: (context, item) => UserCard(user: item.data),
  loadingStyle: LoadingStyle.skeletonizer(
    child: UserCard(user: User.placeholder()),
    effect: SkeletonizerEffect.shimmer,
  ),
)

Boş Durum

Liste boş olduğunda özel bir widget görüntüleyin:

CollectionView<Item>(
  data: () async => await fetchItems(),
  builder: (context, item) => ItemTile(item: item.data),
  empty: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(Icons.inbox, size: 64, color: Colors.grey),
        SizedBox(height: 16),
        Text('No items found'),
      ],
    ),
  ),
)

Veri Sıralama ve Dönüştürme

Sıralama

Öğeleri görüntülemeden önce sıralayın:

CollectionView<Task>(
  data: () async => await fetchTasks(),
  builder: (context, item) => TaskTile(task: item.data),
  sort: (List<Task> items) {
    items.sort((a, b) => a.dueDate.compareTo(b.dueDate));
    return items;
  },
)

Dönüştürme

Yükleme sonrasında verileri dönüştürün:

CollectionView<User>(
  data: () async => await fetchUsers(),
  builder: (context, item) => UserTile(user: item.data),
  transform: (List<User> users) {
    // Filter to only active users
    return users.where((u) => u.isActive).toList();
  },
)

Durumu Güncelleme

Bir CollectionView'a stateName vererek güncelleyebilir veya sıfırlayabilirsiniz:

CollectionView<Todo>(
  stateName: "my_todo_list",
  data: () async => await fetchTodos(),
  builder: (context, item) => TodoTile(todo: item.data),
)

Listeyi sıfırlama

// Resets and reloads data from scratch
CollectionView.stateReset("my_todo_list");

Bir öğeyi kaldırma

// Remove item at index 2
CollectionView.removeFromIndex("my_todo_list", 2);

Genel güncelleme tetikleme

// Using the global updateState helper
updateState("my_todo_list");

Parametre Referansı

Ortak Parametreler

Parametre Tür Açıklama
data Function() List<T> veya Future<List<T>> döndüren fonksiyon
builder CollectionItemBuilder<T> Her öğe için oluşturucu fonksiyon
empty Widget? Liste boş olduğunda gösterilen widget
loadingStyle LoadingStyle? Yükleme göstergesini özelleştirme
header Widget? Listenin üstündeki başlık widget'ı
stateName String? Durum yönetimi için ad
sort Function(List<T>)? Öğeler için sıralama fonksiyonu
transform Function(List<T>)? Veri için dönüştürme fonksiyonu
spacing double? Öğeler arası boşluk

Çekilebilir Özel Parametreler

Parametre Tür Açıklama
data Function(int iteration) Sayfalanmış veri fonksiyonu
onRefresh Function()? Yenileme tamamlandığında callback
beforeRefresh Function()? Yenilemeden önce callback
afterRefresh Function(dynamic)? Veri yüklendikten sonra callback
headerStyle String? Çekme göstergesi stili
footerLoadingIcon Widget? Sayfalama için özel yükleme göstergesi

Grid Özel Parametreleri

Parametre Tür Açıklama
crossAxisCount int Sütun sayısı (varsayılan: 2)
mainAxisSpacing double Öğeler arası dikey boşluk
crossAxisSpacing double Öğeler arası yatay boşluk

ListView Parametreleri

Tüm standart ListView parametreleri de desteklenir: scrollDirection, reverse, controller, physics, shrinkWrap, padding, cacheExtent ve daha fazlası.