import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
// Define a model class to represent the data
class Post {
final int id;
final String title;
final String body;
Post({this.id, this.title, this.body});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}
class DataFetchScreen extends StatefulWidget {
@override
_DataFetchScreenState createState() => _DataFetchScreenState();
}
class _DataFetchScreenState extends State<DataFetchScreen> {
List<Post> posts = [];
bool isLoading = false;
String errorMessage;
Future fetchData() async {
setState(() {
isLoading = true;
});
var url = 'https://jsonplaceholder.typicode.com/posts';
try {
var response = await http.get(url);
if (response.statusCode == 200) {
List<dynamic> data = json.decode(response.body);
setState(() {
posts = data.map((item) => Post.fromJson(item)).toList();
errorMessage = null;
});
} else {
setState(() {
errorMessage = 'Failed to load data: ${response.statusCode}';
});
}
} catch (e) {
setState(() {
errorMessage = 'Failed to load data: $e';
});
} finally {
setState(() {
isLoading = false;
});
}
}
@override
void initState() {
super.initState();
fetchData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Data Fetch'),
),
body: isLoading
? Center(
child: CircularProgressIndicator(),
)
: errorMessage != null
? Center(
child: Text(errorMessage),
)
: ListView.builder(
itemCount: posts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(posts[index].title),
subtitle: Text(posts[index].body),
);
},
),
);
}
}
void main() {
runApp(MaterialApp(
home: DataFetchScreen(),
));
}
Comments
Post a Comment