//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")));
});
}
}
@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;
});
}
}
@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)