Making API Calls in Flutter
Making API Calls in Flutter
Flutter
Shuja Akbar
Import the http Package
HTTP Package
• Add the http package to your pubspec.yaml file:
dependencies:
http: ^1.0.0
if (response.statusCode == 201) {
final data = jsonDecode(response.body);
print('Post created: $data');
} else {
print('Error: ${response.statusCode}');
}
} catch (e) {
print('An error occurred: $e');
}
}
Using Async/Await
• Network calls are asynchronous, use async and await to
wait for the responses. This prevents the UI from
blocking while waiting for the API response.
@override ElevatedButton(
void initState() { onPressed: sendData,
super.initState(); child: Text('Send Data'),
fetchData(); )
}
Handling Errors
• Wrap API calls in a try-catch block to handle any errors
that might occur during network communication, such
as network failures or invalid URLs.
Displaying Data in @override
the UI
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
Widget build(BuildContext context) {
} return Scaffold(
class _MyWidgetState extends State<MyWidget> { appBar: AppBar(title: Text('Posts')),
List<dynamic> posts = []; body: posts.isEmpty
@override ? Center(child: CircularProgressIndicator())
void initState() {
super.initState(); : ListView.builder(
fetchData(); itemCount: posts.length,
}
itemBuilder: (context, index) {
Future<void> fetchData() async {
final url = Uri.parse('https://jsonplaceholder.typicode.com/posts');
final post = posts[index];
return ListTile(
try {
final response = await http.get(url); title: Text(post['title']),
if (response.statusCode == 200) {
subtitle: Text(post['body']),
setState(() { );
posts = jsonDecode(response.body);
}); },
} else {
print('Error: ${response.statusCode}');
),
} );
} catch (e) {
print('An error occurred: $e'); }
}
} }
USING FUTURE BUILDER
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
try {
final response = await http.get(url);
if (response.statusCode == 200) {
// Parse the JSON response into a list
return jsonDecode(response.body);
} else {
throw Exception('Failed to load posts');
}
} catch (e) {
throw Exception('Error: $e');
}
}
class PostsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Posts'),
),
body: FutureBuilder<List<dynamic>>(
future: fetchPosts(),
builder: (context, snapshot) {
// Display a loading indicator while the data is loading
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
// Handle errors
if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
}
if (snapshot.hasData) {
final posts = snapshot.data!;
return ListView.builder(
itemCount: posts.length,
itemBuilder: (context, index) {
final post = posts[index];
return ListTile(
title: Text(post['title']),
subtitle: Text(post['body']),
);},);}
// Default case when there's no data yet
return Center(child: Text('No data available'));
}, ), ); }
}