Widgets

CollectionView

परिचय

CollectionView विजेट आपके Nylo Website प्रोजेक्ट्स में डेटा की लिस्ट दिखाने के लिए एक शक्तिशाली, टाइप-सेफ रैपर है। यह ListView, ListView.separated, और ग्रिड लेआउट के साथ काम करना सरल बनाता है और निम्नलिखित के लिए बिल्ट-इन सपोर्ट प्रदान करता है:

  • ऑटोमैटिक लोडिंग स्टेट्स के साथ एसिंक डेटा लोडिंग
  • पुल-टू-रिफ्रेश और पेजिनेशन
  • पोजिशन हेल्पर्स के साथ टाइप-सेफ आइटम बिल्डर्स
  • खाली स्थिति हैंडलिंग
  • डेटा सॉर्टिंग और ट्रांसफॉर्मेशन

बेसिक उपयोग

यहाँ आइटम्स की लिस्ट दिखाने का एक सरल उदाहरण है:

@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 से एसिंक डेटा के साथ:

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 हेल्पर

builder कॉलबैक एक CollectionItem<T> ऑब्जेक्ट प्राप्त करता है जो आपके डेटा को उपयोगी पोजिशन हेल्पर्स के साथ रैप करता है:

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 प्रॉपर्टीज़

प्रॉपर्टी टाइप विवरण
data T वास्तविक आइटम डेटा
index int लिस्ट में वर्तमान इंडेक्स
totalItems int कुल आइटम्स की संख्या
isFirst bool यदि यह पहला आइटम है तो True
isLast bool यदि यह अंतिम आइटम है तो True
isOdd bool यदि इंडेक्स विषम है तो True
isEven bool यदि इंडेक्स सम है तो True
progress double लिस्ट में प्रगति (0.0 से 1.0)

CollectionItem मेथड्स

मेथड विवरण
isAt(int position) जाँचें कि आइटम विशिष्ट पोजिशन पर है या नहीं
isInRange(int start, int end) जाँचें कि इंडेक्स रेंज के भीतर है या नहीं (इनक्लूसिव)
isMultipleOf(int divisor) जाँचें कि इंडेक्स डिवाइज़र का गुणज है या नहीं

CollectionView

डिफ़ॉल्ट कंस्ट्रक्टर एक स्टैंडर्ड लिस्ट व्यू बनाता है:

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

आइटम्स के बीच सेपरेटर्स के साथ एक लिस्ट बनाता है:

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

स्टैगर्ड ग्रिड का उपयोग करके ग्रिड लेआउट बनाता है:

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

पुल-टू-रिफ्रेश और इनफिनिट स्क्रॉल पेजिनेशन के साथ एक लिस्ट बनाता है:

CollectionView<Post>.pullable(
  data: (int iteration) async {
    // iteration 1 से शुरू होता है और हर लोड पर बढ़ता है
    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', // पुल इंडिकेटर स्टाइल
)

हेडर स्टाइल्स

headerStyle पैरामीटर स्वीकार करता है:

  • 'WaterDropHeader' (डिफ़ॉल्ट) - वॉटर ड्रॉप एनिमेशन
  • 'ClassicHeader' - क्लासिक पुल इंडिकेटर
  • 'MaterialClassicHeader' - मटीरियल डिज़ाइन स्टाइल
  • 'WaterDropMaterialHeader' - मटीरियल वॉटर ड्रॉप
  • 'BezierHeader' - बेज़ियर कर्व एनिमेशन

पेजिनेशन कॉलबैक्स

कॉलबैक विवरण
beforeRefresh रिफ्रेश शुरू होने से पहले कॉल होता है
onRefresh रिफ्रेश पूरा होने पर कॉल होता है
afterRefresh डेटा लोड होने के बाद कॉल होता है, ट्रांसफॉर्मेशन के लिए डेटा प्राप्त करता है

CollectionView.pullableSeparated

पुल-टू-रिफ्रेश को सेपरेटेड लिस्ट के साथ जोड़ता है:

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

CollectionView.pullableGrid

पुल-टू-रिफ्रेश को ग्रिड लेआउट के साथ जोड़ता है:

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,
)

लोडिंग स्टाइल्स

loadingStyle का उपयोग करके लोडिंग इंडिकेटर को कस्टमाइज़ करें:

// कस्टम विजेट के साथ सामान्य लोडिंग
CollectionView<Item>(
  data: () async => await fetchItems(),
  builder: (context, item) => ItemTile(item: item.data),
  loadingStyle: LoadingStyle.normal(
    child: Text("Loading items..."),
  ),
)

// स्केलेटनाइज़र लोडिंग इफेक्ट
CollectionView<User>(
  data: () async => await fetchUsers(),
  builder: (context, item) => UserCard(user: item.data),
  loadingStyle: LoadingStyle.skeletonizer(
    child: UserCard(user: User.placeholder()),
    effect: SkeletonizerEffect.shimmer,
  ),
)

खाली स्थिति

लिस्ट खाली होने पर एक कस्टम विजेट दिखाएँ:

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'),
      ],
    ),
  ),
)

डेटा सॉर्टिंग और ट्रांसफॉर्मिंग

सॉर्टिंग

दिखाने से पहले आइटम्स को सॉर्ट करें:

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;
  },
)

ट्रांसफॉर्म

लोड होने के बाद डेटा को ट्रांसफॉर्म करें:

CollectionView<User>(
  data: () async => await fetchUsers(),
  builder: (context, item) => UserTile(user: item.data),
  transform: (List<User> users) {
    // केवल सक्रिय यूज़र्स को फ़िल्टर करें
    return users.where((u) => u.isActive).toList();
  },
)

स्टेट अपडेट करना

आप stateName देकर CollectionView को अपडेट या रीसेट कर सकते हैं:

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

लिस्ट रीसेट करें

// डेटा को शुरू से रीसेट और रीलोड करता है
CollectionView.stateReset("my_todo_list");

एक आइटम हटाएँ

// इंडेक्स 2 पर आइटम हटाएँ
CollectionView.removeFromIndex("my_todo_list", 2);

सामान्य अपडेट ट्रिगर करें

// ग्लोबल updateState हेल्पर का उपयोग करके
updateState("my_todo_list");

पैरामीटर्स रेफरेंस

सामान्य पैरामीटर्स

पैरामीटर टाइप विवरण
data Function() List<T> या Future<List<T>> लौटाने वाला फ़ंक्शन
builder CollectionItemBuilder<T> प्रत्येक आइटम के लिए बिल्डर फ़ंक्शन
empty Widget? लिस्ट खाली होने पर दिखाया जाने वाला विजेट
loadingStyle LoadingStyle? लोडिंग इंडिकेटर कस्टमाइज़ करें
header Widget? लिस्ट के ऊपर हेडर विजेट
stateName String? स्टेट मैनेजमेंट के लिए नाम
sort Function(List<T>)? आइटम्स के लिए सॉर्ट फ़ंक्शन
transform Function(List<T>)? डेटा के लिए ट्रांसफॉर्म फ़ंक्शन
spacing double? आइटम्स के बीच स्पेसिंग

पुलेबल-विशिष्ट पैरामीटर्स

पैरामीटर टाइप विवरण
data Function(int iteration) पेजिनेटेड डेटा फ़ंक्शन
onRefresh Function()? रिफ्रेश पूरा होने पर कॉलबैक
beforeRefresh Function()? रिफ्रेश से पहले कॉलबैक
afterRefresh Function(dynamic)? डेटा लोड होने के बाद कॉलबैक
headerStyle String? पुल इंडिकेटर स्टाइल
footerLoadingIcon Widget? पेजिनेशन के लिए कस्टम लोडिंग इंडिकेटर

ग्रिड-विशिष्ट पैरामीटर्स

पैरामीटर टाइप विवरण
crossAxisCount int कॉलम्स की संख्या (डिफ़ॉल्ट: 2)
mainAxisSpacing double आइटम्स के बीच वर्टिकल स्पेसिंग
crossAxisSpacing double आइटम्स के बीच हॉरिज़ॉन्टल स्पेसिंग

ListView पैरामीटर्स

सभी स्टैंडर्ड ListView पैरामीटर्स भी सपोर्टेड हैं: scrollDirection, reverse, controller, physics, shrinkWrap, padding, cacheExtent, और अन्य।