Pullable
परिचय
Pullable विजेट किसी भी स्क्रॉल करने योग्य कंटेंट में पुल-टू-रिफ्रेश और लोड-मोर कार्यक्षमता जोड़ता है। यह आपके चाइल्ड विजेट को जेस्चर-ड्रिवन रिफ्रेश और पेजिनेशन व्यवहार से लपेटता है, कई हेडर एनिमेशन स्टाइल का समर्थन करता है।
pull_to_refresh_flutter3 पैकेज पर निर्मित, Pullable सामान्य कॉन्फ़िगरेशन के लिए नामित कंस्ट्रक्टर के साथ एक साफ API प्रदान करता है।
Pullable(
onRefresh: () async {
// Fetch fresh data
await fetchData();
},
child: ListView(
children: items.map((item) => ListTile(title: Text(item))).toList(),
),
)
बुनियादी उपयोग
किसी भी स्क्रॉल करने योग्य विजेट को Pullable से लपेटें:
Pullable(
onRefresh: () async {
await loadLatestPosts();
},
child: ListView.builder(
itemCount: posts.length,
itemBuilder: (context, index) => PostCard(post: posts[index]),
),
)
जब उपयोगकर्ता सूची को नीचे खींचता है, तो onRefresh कॉलबैक ट्रिगर होता है। कॉलबैक पूरा होने पर रिफ्रेश इंडिकेटर स्वचालित रूप से समाप्त हो जाता है।
कंस्ट्रक्टर
Pullable सामान्य कॉन्फ़िगरेशन के लिए नामित कंस्ट्रक्टर प्रदान करता है:
| कंस्ट्रक्टर | हेडर स्टाइल | विवरण |
|---|---|---|
Pullable() |
Water Drop | डिफ़ॉल्ट कंस्ट्रक्टर |
Pullable.classicHeader() |
Classic | क्लासिक पुल-टू-रिफ्रेश स्टाइल |
Pullable.waterDropHeader() |
Water Drop | वॉटर ड्रॉप एनिमेशन |
Pullable.materialClassicHeader() |
Material Classic | मटीरियल डिज़ाइन क्लासिक स्टाइल |
Pullable.waterDropMaterialHeader() |
Water Drop Material | मटीरियल वॉटर ड्रॉप स्टाइल |
Pullable.bezierHeader() |
Bezier | बेज़ियर कर्व एनिमेशन |
Pullable.noBounce() |
कॉन्फ़िगर करने योग्य | ClampingScrollPhysics के साथ कम बाउंस |
Pullable.custom() |
कस्टम विजेट | अपने स्वयं के हेडर/फ़ुटर विजेट उपयोग करें |
Pullable.builder() |
कॉन्फ़िगर करने योग्य | पूर्ण PullableConfig नियंत्रण |
उदाहरण
// Classic header
Pullable.classicHeader(
onRefresh: () async => await refreshData(),
child: myListView,
)
// Material header
Pullable.materialClassicHeader(
onRefresh: () async => await refreshData(),
child: myListView,
)
// No bounce effect
Pullable.noBounce(
onRefresh: () async => await refreshData(),
headerType: PullableHeaderType.classic,
child: myListView,
)
// Custom header widget
Pullable.custom(
customHeader: MyCustomRefreshHeader(),
onRefresh: () async => await refreshData(),
child: myListView,
)
PullableConfig
बारीक नियंत्रण के लिए, Pullable.builder() कंस्ट्रक्टर के साथ PullableConfig का उपयोग करें:
Pullable.builder(
config: PullableConfig(
enablePullDown: true,
enablePullUp: true,
headerType: PullableHeaderType.materialClassic,
onRefresh: () async => await refreshData(),
onLoading: () async => await loadMoreData(),
refreshCompleteDelay: Duration(milliseconds: 500),
loadCompleteDelay: Duration(milliseconds: 300),
physics: BouncingScrollPhysics(),
),
child: myListView,
)
सभी कॉन्फ़िगरेशन विकल्प
| प्रॉपर्टी | टाइप | डिफ़ॉल्ट | विवरण |
|---|---|---|---|
enablePullDown |
bool |
true |
पुल-डाउन-टू-रिफ्रेश सक्षम करें |
enablePullUp |
bool |
false |
पुल-अप-टू-लोड-मोर सक्षम करें |
physics |
ScrollPhysics? |
null | कस्टम स्क्रॉल फ़िज़िक्स |
onRefresh |
Future<void> Function()? |
null | रिफ्रेश कॉलबैक |
onLoading |
Future<void> Function()? |
null | लोड-मोर कॉलबैक |
headerType |
PullableHeaderType |
waterDrop |
हेडर एनिमेशन स्टाइल |
customHeader |
Widget? |
null | कस्टम हेडर विजेट |
customFooter |
Widget? |
null | कस्टम फ़ुटर विजेट |
refreshCompleteDelay |
Duration |
Duration.zero |
रिफ्रेश पूरा होने से पहले विलंब |
loadCompleteDelay |
Duration |
Duration.zero |
लोड पूरा होने से पहले विलंब |
enableOverScroll |
bool |
true |
ओवर-स्क्रॉल इफेक्ट की अनुमति दें |
cacheExtent |
double? |
null | स्क्रॉल कैश एक्सटेंट |
semanticChildCount |
int? |
null | सिमेंटिक चिल्ड्रन काउंट |
dragStartBehavior |
DragStartBehavior |
start |
ड्रैग जेस्चर कैसे शुरू होते हैं |
हेडर स्टाइल
पाँच बिल्ट-इन हेडर एनिमेशन में से चुनें:
enum PullableHeaderType {
classic, // Classic pull indicator
waterDrop, // Water drop animation (default)
materialClassic, // Material Design classic
waterDropMaterial, // Material water drop
bezier, // Bezier curve animation
}
कंस्ट्रक्टर या कॉन्फ़िग के माध्यम से स्टाइल सेट करें:
// Via named constructor
Pullable.bezierHeader(
onRefresh: () async => await refreshData(),
child: myListView,
)
// Via config
Pullable.builder(
config: PullableConfig(
headerType: PullableHeaderType.bezier,
onRefresh: () async => await refreshData(),
),
child: myListView,
)
और लोड करने के लिए ऊपर खींचें
पुल-अप लोडिंग के साथ पेजिनेशन सक्षम करें:
Pullable.builder(
config: PullableConfig(
enablePullDown: true,
enablePullUp: true,
onRefresh: () async {
// Reset to page 1
page = 1;
items = await fetchItems(page: page);
setState(() {});
},
onLoading: () async {
// Load next page
page++;
List<Item> more = await fetchItems(page: page);
items.addAll(more);
setState(() {});
},
),
child: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => ItemTile(item: items[index]),
),
)
कस्टम हेडर और फ़ुटर
अपने स्वयं के हेडर और फ़ुटर विजेट प्रदान करें:
Pullable.custom(
customHeader: Container(
height: 60,
alignment: Alignment.center,
child: CircularProgressIndicator(),
),
customFooter: Container(
height: 40,
alignment: Alignment.center,
child: Text("Loading more..."),
),
enablePullUp: true,
onRefresh: () async => await refreshData(),
onLoading: () async => await loadMore(),
child: myListView,
)
कंट्रोलर
प्रोग्रामेटिक नियंत्रण के लिए RefreshController का उपयोग करें:
final RefreshController _controller = RefreshController();
Pullable(
controller: _controller,
onRefresh: () async => await refreshData(),
child: myListView,
)
// Trigger refresh programmatically
_controller.triggerRefresh();
// Trigger loading programmatically
_controller.triggerLoading();
// Check state
bool refreshing = _controller.isRefreshing;
bool loading = _controller.isLoading;
RefreshController पर एक्सटेंशन मेथड
| मेथड/गेटर | रिटर्न टाइप | विवरण |
|---|---|---|
triggerRefresh() |
void |
मैन्युअल रूप से रिफ्रेश ट्रिगर करें |
triggerLoading() |
void |
मैन्युअल रूप से लोड-मोर ट्रिगर करें |
isRefreshing |
bool |
रिफ्रेश सक्रिय है या नहीं |
isLoading |
bool |
लोडिंग सक्रिय है या नहीं |
एक्सटेंशन मेथड
.pullable() एक्सटेंशन का उपयोग करके किसी भी विजेट को पुल-टू-रिफ्रेश से लपेटा जा सकता है:
ListView(
children: items.map((item) => ListTile(title: Text(item.name))).toList(),
).pullable(
onRefresh: () async {
await fetchItems();
},
)
कस्टम कॉन्फ़िग के साथ:
myListView.pullable(
onRefresh: () async => await refreshData(),
pullableConfig: PullableConfig(
headerType: PullableHeaderType.classic,
enablePullUp: true,
onLoading: () async => await loadMore(),
),
)
CollectionView एकीकरण
CollectionView बिल्ट-इन पेजिनेशन के साथ pullable वेरिएंट प्रदान करता है:
CollectionView.pullable
CollectionView<User>.pullable(
data: (iteration) async => api.getUsers(page: iteration),
builder: (context, item) => UserTile(user: item.data),
onRefresh: () => print('Refreshed!'),
headerStyle: 'WaterDropHeader',
)
CollectionView.pullableSeparated
CollectionView<User>.pullableSeparated(
data: (iteration) async => api.getUsers(page: iteration),
builder: (context, item) => UserTile(user: item.data),
separatorBuilder: (context, index) => Divider(),
)
CollectionView.pullableGrid
CollectionView<Product>.pullableGrid(
data: (iteration) async => api.getProducts(page: iteration),
builder: (context, item) => ProductCard(product: item.data),
crossAxisCount: 2,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
)
Pullable-विशिष्ट पैरामीटर
| पैरामीटर | टाइप | विवरण |
|---|---|---|
data |
Function(int iteration) |
पेजिनेटेड डेटा कॉलबैक (iteration 1 से शुरू होता है) |
onRefresh |
Function()? |
रिफ्रेश के बाद कॉलबैक |
beforeRefresh |
Function()? |
रिफ्रेश शुरू होने से पहले हुक |
afterRefresh |
Function(dynamic)? |
डेटा के साथ रिफ्रेश के बाद हुक |
headerStyle |
String? |
हेडर टाइप का नाम (उदा., 'WaterDropHeader', 'ClassicHeader') |
footerLoadingIcon |
Widget? |
फ़ुटर के लिए कस्टम लोडिंग इंडिकेटर |
उदाहरण
रिफ्रेश के साथ पेजिनेटेड सूची
class _PostListState extends NyState<PostListPage> {
List<Post> posts = [];
int page = 1;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Pullable.builder(
config: PullableConfig(
enablePullDown: true,
enablePullUp: true,
headerType: PullableHeaderType.materialClassic,
onRefresh: () async {
page = 1;
posts = await api<PostApiService>((request) => request.getPosts(page: page));
setState(() {});
},
onLoading: () async {
page++;
List<Post> more = await api<PostApiService>((request) => request.getPosts(page: page));
posts.addAll(more);
setState(() {});
},
),
child: ListView.builder(
itemCount: posts.length,
itemBuilder: (context, index) => PostCard(post: posts[index]),
),
),
);
}
}
एक्सटेंशन के साथ सरल रिफ्रेश
ListView(
children: notifications
.map((n) => ListTile(
title: Text(n.title),
subtitle: Text(n.body),
))
.toList(),
).pullable(
onRefresh: () async {
notifications = await fetchNotifications();
setState(() {});
},
)