DEV Community

Chintan Gohil
Chintan Gohil

Posted on

flutter load more 1

//search bar import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class LastDemo extends StatefulWidget {
const LastDemo({super.key});

@override
State createState() => _LastDemoState();
}

class _LastDemoState extends State {
List posts = [];
bool _isloading = false;
bool hasmore = true;
int currentpage = 1;
int limit = 15;
String? erroemessage;
ScrollController scrollController = ScrollController();

TextEditingController searchController = TextEditingController();
String searchQuery = '';

List get filteredPosts {
if (searchQuery.isEmpty) return posts;
return posts
.where((post) => post['title']
.toString()
.toLowerCase()
.contains(searchQuery.toLowerCase()))
.toList();
}

@override
void initState() {
super.initState();
fetchProducts();
scrollController.addListener(() {
if (scrollController.position.pixels >=
scrollController.position.maxScrollExtent - 200 &&
!_isloading &&
hasmore &&
searchQuery.isEmpty) {
fetchProducts();
}
});
}

Future fetchProducts() async {
setState(() {
_isloading = true;
});
final response = await http.get(Uri.parse(
'https://jsonplaceholder.typicode.com/posts?_page=$currentpage&_limit=$limit'));

try {
  if (response.statusCode == 200) {
    final List<dynamic> data = jsonDecode(response.body);

    setState(() {
      currentpage++;
      posts.addAll(data);
      _isloading = false;
      if (data.length < limit) {
        hasmore = false;
      }
    });
  } else {
    setState(() {
      _isloading = false;
      ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to load data')));
    });
  }
} catch (e) {
  setState(() {
    _isloading = false;
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text("The error is $e")));
  });
}
Enter fullscreen mode Exit fullscreen mode

}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Demo Of AppBar')),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: searchController,
decoration: InputDecoration(
labelText: 'Search by title',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.search),
),
onChanged: (value) {
setState(() {
searchQuery = value;
});
},
),
),
Expanded(
child: ListView.builder(
controller: scrollController,
itemCount: filteredPosts.length +
(_isloading && hasmore && searchQuery.isEmpty ? 1 : 0),
itemBuilder: (context, index) {
if (index < filteredPosts.length) {
final post = filteredPosts[index];
return ListTile(
leading: CircleAvatar(
child: Text(post['id'].toString()),
),
title: Text(post['title']),
);
} else {
// Only show loader if not searching
return searchQuery.isEmpty
? Padding(
padding: EdgeInsets.all(16),
child: Center(child: CircularProgressIndicator()),
)
: SizedBox(); // No loader during search
}
},
),
),
],
),
);
}
}

//push data
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class PushAndLoadDemo extends StatefulWidget {
const PushAndLoadDemo({super.key});
@override
State createState() => _PushAndLoadDemoState();
}

class _PushAndLoadDemoState extends State {
List users = [];
int page = 1;
bool isLoading = false;

final nameController = TextEditingController();
final jobController = TextEditingController();

Future postData(String name, String job) async {
final res = await http.post(
Uri.parse("https://reqres.in/api/users"),
body: {'name': name, 'job': job},
);
if (res.statusCode == 201) {
final data = json.decode(res.body);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("User Added: ${data['name']}")),
);
}
}

Future loadUsers() async {
if (isLoading) return;
setState(() => isLoading = true);

final res = await http.get(Uri.parse("https://reqres.in/api/users?page=$page"));
if (res.statusCode == 200) {
  final data = json.decode(res.body);
  setState(() {
    users.addAll(data['data']);
    page++;
    isLoading = false;
  });
}
Enter fullscreen mode Exit fullscreen mode

}

@override
void initState() {
super.initState();
loadUsers();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("POST + Load More")),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8),
child: Column(
children: [
TextField(controller: nameController, decoration: InputDecoration(labelText: "Name")),
TextField(controller: jobController, decoration: InputDecoration(labelText: "Job")),
ElevatedButton(
onPressed: () => postData(nameController.text, jobController.text),
child: Text("Submit"),
),
],
),
),
Expanded(
child: ListView.builder(
itemCount: users.length + 1,
itemBuilder: (context, index) {
if (index < users.length) {
return ListTile(
leading: Image.network(users[index]['avatar']),
title: Text(users[index]['first_name']),
);
} else {
loadUsers(); // Load more
return Center(child: CircularProgressIndicator());
}
},
),
),
],
),
);
}
}

Top comments (0)