model
// models/post.dart
class Post {
final int id;
final String title;
final String body;
Post({required this.id, required this.title, required this.body});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}
provider
// providers/post_provider.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import '../models/post.dart';
class PostProvider extends ChangeNotifier {
List<Post> _posts = [];
List<Post> get posts => _posts;
Future<void> fetchPosts() async {
final url = Uri.parse('https://jsonplaceholder.typicode.com/posts');
final response = await http.get(url);
if (response.statusCode == 200) {
Iterable jsonResponse = json.decode(response.body);
_posts = jsonResponse.map((model) => Post.fromJson(model)).toList();
notifyListeners();
} else {
throw Exception('Failed to load posts');
}
}
}
widget
// screens/post_screen.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/post_provider.dart';
import '../models/post.dart';
class PostScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Posts'),
),
body: Center(
child: Consumer<PostProvider>(
builder: (context, postProvider, _) {
if (postProvider.posts.isEmpty) {
return CircularProgressIndicator(); // or any loading indicator
} else {
return ListView.builder(
itemCount: postProvider.posts.length,
itemBuilder: (context, index) {
Post post = postProvider.posts[index];
return ListTile(
title: Text(post.title),
subtitle: Text(post.body),
);
},
);
}
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Call the fetchPosts method when FloatingActionButton is pressed
Provider.of<PostProvider>(context, listen: false).fetchPosts();
},
child: Icon(Icons.refresh),
),
);
}
}
main
// main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/post_provider.dart';
import 'screens/post_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => PostProvider(),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PostScreen(),
),
);
}
}
Comments
Post a Comment