option 1
option 2
option 3
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
// API Service
class ApiService {
static const String baseUrl = "https://jsonplaceholder.typicode.com";
static Future<List<dynamic>> fetchData(int page, int limit) async {
final response = await http.get(Uri.parse("$baseUrl/posts?_page=$page&_limit=$limit"));
if (response.statusCode == 200) {
return json.decode(response.body);
} else {
throw Exception("Failed to load data");
}
}
}
// GetX Controller for Pagination
class PaginationController extends GetxController {
var items = <dynamic>[].obs;
var page = 1.obs;
final int limit = 10;
var isLoading = false.obs;
var hasMore = true.obs;
ScrollController scrollController = ScrollController();
@override
void onInit() {
fetchItems();
scrollController.addListener(() {
if (scrollController.position.pixels >= scrollController.position.maxScrollExtent - 100) {
fetchItems(); // Load more data when close to bottom
}
});
super.onInit();
}
Future<void> fetchItems() async {
if (isLoading.value || !hasMore.value) return;
isLoading(true);
try {
var newItems = await ApiService.fetchData(page.value, limit);
if (newItems.isNotEmpty) {
items.addAll(newItems);
page.value++;
} else {
hasMore(false); // No more data
}
} catch (e) {
print("Error: $e");
} finally {
isLoading(false);
}
}
}
// UI: Home Page with Infinite Scrolling using ScrollController
class HomePage extends StatelessWidget {
final PaginationController controller = Get.put(PaginationController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Pagination with ScrollController")),
body: Obx(() {
if (controller.items.isEmpty && controller.isLoading.value) {
return Center(child: CircularProgressIndicator());
}
return ListView.builder(
controller: controller.scrollController,
itemCount: controller.items.length + (controller.hasMore.value ? 1 : 0),
itemBuilder: (context, index) {
if (index == controller.items.length) {
return Center(
child: Padding(
padding: EdgeInsets.all(8.0),
child: CircularProgressIndicator(),
),
);
}
return ListTile(
title: Text(controller.items[index]['title']),
);
},
);
}),
);
}
}
void main() {
runApp(GetMaterialApp(
home: HomePage(),
debugShowCheckedModeBanner: false,
));
}
option 2
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
// API Service
class ApiService {
static const String baseUrl = "https://jsonplaceholder.typicode.com";
static Future<List<dynamic>> fetchData(int page, int limit) async {
final response = await http.get(Uri.parse("$baseUrl/posts?_page=$page&_limit=$limit"));
if (response.statusCode == 200) {
return json.decode(response.body);
} else {
throw Exception("Failed to load data");
}
}
}
// GetX Controller for Pagination
class PaginationController extends GetxController {
var items = <dynamic>[].obs;
var page = 1.obs;
final int limit = 10;
var isLoading = false.obs;
var hasMore = true.obs;
@override
void onInit() {
fetchItems();
super.onInit();
}
Future<void> fetchItems() async {
if (isLoading.value || !hasMore.value) return;
isLoading(true);
try {
var newItems = await ApiService.fetchData(page.value, limit);
if (newItems.isNotEmpty) {
items.addAll(newItems);
page.value++;
} else {
hasMore(false); // No more data
}
} catch (e) {
print("Error: $e");
} finally {
isLoading(false);
}
}
}
// UI: Home Page with Infinite Scrolling
class HomePage extends StatelessWidget {
final PaginationController controller = Get.put(PaginationController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Pagination with GetX")),
body: Obx(() {
if (controller.items.isEmpty && controller.isLoading.value) {
return Center(child: CircularProgressIndicator());
}
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification scrollInfo) {
if (!controller.isLoading.value &&
scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
controller.fetchItems(); // Load more data when reaching bottom
}
return false;
},
child: ListView.builder(
itemCount: controller.items.length + (controller.hasMore.value ? 1 : 0),
itemBuilder: (context, index) {
if (index == controller.items.length) {
return Center(
child: Padding(
padding: EdgeInsets.all(8.0),
child: CircularProgressIndicator(),
),
);
}
return ListTile(
title: Text(controller.items[index]['title']),
);
},
),
);
}),
);
}
}
void main() {
runApp(GetMaterialApp(
home: HomePage(),
debugShowCheckedModeBanner: false,
));
}
option 3
Comments
Post a Comment