In app development, the ability to fetch data from external sources, such as REST APIs, is a fundamental requirement. In Flutter, whether you need to send some data to the RESTful API, access a database, or then Send content from the Flutter App, Flutter provides you with the tools and packages(HTTP) to do this kind of API calls easily. Here we will explore how to interact with external data sources, Send JSON data(Key-Value pairs), and integrate it into your Flutter application.
Required Tools
To build this app, you need the following items installed on your machine:
- Visual Studio Code / Android Studio
- Android Emulator / iOS Simulator / Physical Device device.
- Flutter Installed
- Flutter plugin for VS Code / Android Studio.
About the API
This is a API link of HTTP POST Request
POST - https://jsonplaceholder.typicode.com/posts
Step By Step Implementations
Step 1: Create a New Project in Android Studio
To set up Flutter Development on Android Studio please refer to Android Studio Setup for Flutter Development, and then create a new project in Android Studio please refer to Creating a Simple Application in Flutter.
Step 2: Add the dependency to our project
In the pubspec.yaml file we have to add the below dependency for the http package which provide varrious API call methods.
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
http: ^1.1.0
Step 3: Import the Package
First of all import material.dart file.
import 'package:flutter/material.dart';
Step 4: Execute the main Method
Here the execution of our app starts.
void main() {
runApp(MyApp());
} |
Step 5: Create MyApp Class
In this class we are going to implement the MaterialApp , here we are also set the Theme of our App.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false ,
theme: ThemeData(
primarySwatch: Colors.green, // Set the app's primary theme color
),
home: APICall(),
);
}
} |
Step 6: Create APICall Class
In this class we are going to make HTTP POST request to the API endpoint and Display the result that would received from the API (Sucess Status Code for this API call is 201).
class APICall extends StatefulWidget {
@override
_APICallState createState() => _APICallState();
} class _APICallState extends State<APICall> {
final TextEditingController nameController = TextEditingController();
final TextEditingController emailController = TextEditingController();
String result = '' ; // To store the result from the API call
@override
void dispose() {
nameController.dispose();
emailController.dispose();
super.dispose();
}
Future< void > _postData() async {
try {
final response = await http.post(
Uri.parse(apiUrl),
headers: <String, String>{
'Content-Type' : 'application/json; charset=UTF-8' ,
},
body: jsonEncode(<String, dynamic>{
'name' : nameController.text,
'email' : emailController.text,
// Add any other data you want to send in the body
}),
);
if (response.statusCode == 201) {
// Successful POST request, handle the response here
final responseData = jsonDecode(response.body);
setState(() {
result = 'ID: ${responseData[' id ']}\nName: ${responseData[' name ']}\nEmail: ${responseData[' email ']}' ;
});
} else {
// If the server returns an error response, throw an exception
throw Exception( 'Failed to post data' );
}
} catch (e) {
setState(() {
result = 'Error: $e' ;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text( 'POST Request Example' ),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: nameController,
decoration: InputDecoration(labelText: 'Name' ),
),
TextField(
controller: emailController,
decoration: InputDecoration(labelText: 'Email' ),
),
ElevatedButton(
onPressed: _postData,
child: Text( 'Submit' ),
),
SizedBox(height: 20.0),
Text(
result,
style: TextStyle(fontSize: 16.0),
),
],
),
),
);
}
} |
Here is the full Code of main.dart file
import 'package:flutter/material.dart' ;
import 'package:http/http.dart' as http;
import 'dart:convert' ;
void main() {
runApp(MyApp());
} class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false ,
theme: ThemeData(
primarySwatch: Colors.green, // Set the app's primary theme color
),
home: APICall(),
);
}
} class APICall extends StatefulWidget {
@override
_APICallState createState() => _APICallState();
} class _APICallState extends State<APICall> {
final TextEditingController nameController = TextEditingController();
final TextEditingController emailController = TextEditingController();
String result = '' ; // To store the result from the API call
@override
void dispose() {
nameController.dispose();
emailController.dispose();
super.dispose();
}
Future< void > _postData() async {
try {
final response = await http.post(
Uri.parse(apiUrl),
headers: <String, String>{
'Content-Type' : 'application/json; charset=UTF-8' ,
},
body: jsonEncode(<String, dynamic>{
'name' : nameController.text,
'email' : emailController.text,
// Add any other data you want to send in the body
}),
);
if (response.statusCode == 201) {
// Successful POST request, handle the response here
final responseData = jsonDecode(response.body);
setState(() {
result = 'ID: ${responseData[' id ']}\nName: ${responseData[' name ']}\nEmail: ${responseData[' email ']}' ;
});
} else {
// If the server returns an error response, throw an exception
throw Exception( 'Failed to post data' );
}
} catch (e) {
setState(() {
result = 'Error: $e' ;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text( 'POST Request Example' ),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: nameController,
decoration: InputDecoration(labelText: 'Name' ),
),
TextField(
controller: emailController,
decoration: InputDecoration(labelText: 'Email' ),
),
ElevatedButton(
onPressed: _postData,
child: Text( 'Submit' ),
),
SizedBox(height: 20.0),
Text(
result,
style: TextStyle(fontSize: 16.0),
),
],
),
),
);
}
} |