Flutter – Sending Data To The Internet

23 Jun, 2022
Interacting with the Internet is crucial for most apps to function. In Flutter the http package is used to send the data to the internet. In this article, we will explore the same topic in detail. To send data to the internet through your application follow the below steps:
Import the http packageSend data to the server through the http packageChange the response into custom dart objectDisplay the response
Import the http package
Send data to the server through the http package
Change the response into custom dart object
Display the response
To install the http package use the below command in your command prompt:
pub get
or, if you are using the flutter cmd use the below command:
flutter pub get
After the installation add the dependency to the pubsec.yml file as shown below:
import 'package:http/http.dart' as http;
In this article, we will create an Album data and send it to JSONPlaceholder through the http.post() method.
Dart
Future<Album> createAlbum(String title) async {  final http.Response response = await http.post(    Uri.parse('https://jsonplaceholder.typicode.com/albums'),    headers: <String, String>{      'Content-Type': 'application/json; charset=UTF-8',    },    body: jsonEncode(<String, String>{      'title': title,    }),  );
Though making a network request is no big deal, working with the raw response data can be inconvenient. To make your life easier, convert the raw data (ie, http.response) into dart object. Here we will create an Album class that contains the JSON data as shown below:
Dart
class Album {  final int id;  final String title;   Album({required this.id, required this.title});   factory Album.fromJson(Map<String, dynamic> json) {    return Album(      id: json['id'],      title: json['title'],    );  }}
  
 
Now, follow the below steps to update the fetchAlbum() function to return a Future<Album>:
 
Use the dart: convert package to convert the response body into a JSON Map.Use the fromJSON() factory method to convert JSON Map into Album if the server returns an OK response with a status code of 200.Throw an exception if the server doesn’t return an OK response with a status code of 200.
Use the dart: convert package to convert the response body into a JSON Map.
Use the fromJSON() factory method to convert JSON Map into Album if the server returns an OK response with a status code of 200.
Throw an exception if the server doesn’t return an OK response with a status code of 200.
 
Dart
Future<Album> createAlbum(String title) async {  final http.Response response = await http.post(    'https://jsonplaceholder.typicode.com/albums',    headers: <String, String>{      'Content-Type': 'application/json; charset=UTF-8',    },    body: jsonEncode(<String, String>{      'title': title,    }),  );     // Dispatch action depending upon  // the server response  if (response.statusCode == 201) {    return Album.fromJson(json.decode(response.body));  } else {    throw Exception('Album loading failed!');  }}
Now create a TextField  for the user to enter a title and a RaisedButton to send data to the server. Also, define a TextEditingController to read the user input from a TextField as shown below:
Dart
Column(  mainAxisAlignment: MainAxisAlignment.center,  children: <Widget>[    TextField(      controller: _controller,      decoration:          const InputDecoration(hintText: 'Enter Title'),    ),    ElevatedButton(      child: const Text('Create Data'),      onPressed: () {        setState(() {          _futureAlbum = createAlbum(_controller.text);        });      },    ),     // RiisedButton is deprecated and shouldn't be used. Use ElevatedButton.     // RaisedButton(    //   child: Text('Create Data'),    //   onPressed: () {    //     setState(() {    //       _futureAlbum = createAlbum(_controller.text);    //     });    //   },    // ),  ],)
Use the FlutterBuilder widget to display the data on the screen as shown below:
Dart
FutureBuilder<Album>(  future: _futureAlbum,  builder: (context, snapshot) {    if (snapshot.hasData) {      return Text(snapshot.data!.title);    } else if (snapshot.hasError) {      return Text("${snapshot.error}");    }     return const CircularProgressIndicator();  },),
Complete Source Code:
Dart
import 'dart:async';import 'dart:convert'; import 'package:flutter/material.dart';import 'package:http/http.dart' as http; Future<Album> createAlbum(String title) async {  final http.Response response = await http.post(    Uri.parse('https://jsonplaceholder.typicode.com/albums'),    headers: <String, String>{      'Content-Type': 'application/json; charset=UTF-8',    },    body: jsonEncode(<String, String>{      'title': title,    }),  );   if (response.statusCode == 201) {    return Album.fromJson(json.decode(response.body));  } else {    throw Exception('Failed to create album.');  }} class Album {  final int id;  final String title;   Album({required this.id, required this.title});   factory Album.fromJson(Map<String, dynamic> json) {    return Album(      id: json['id'],      title: json['title'],    );  }} void main() {  runApp(const MyApp());} class MyApp extends StatefulWidget {  const MyApp({Key? key}) : super(key: key);   @override  // ignore: library_private_types_in_public_api  _MyAppState createState() {    return _MyAppState();  }} class _MyAppState extends State<MyApp> {  final TextEditingController _controller = TextEditingController();  late Future<Album> _futureAlbum;   @override  Widget build(BuildContext context) {    return MaterialApp(      title: 'Creating Data',      theme: ThemeData(        primarySwatch: Colors.blue,      ),      home: Scaffold(        appBar: AppBar(          title: const Text('GeeksForGeeks'),          backgroundColor: Colors.green,        ),        body: Container(          alignment: Alignment.center,          padding: const EdgeInsets.all(8.0),          // ignore: unnecessary_null_comparison          child: (_futureAlbum == null)              ? Column(                  mainAxisAlignment: MainAxisAlignment.center,                  children: <Widget>[                    TextField(                      controller: _controller,                      decoration:                          const InputDecoration(hintText: 'Enter Title'),                    ),                    ElevatedButton(                      child: const Text('Create Data'),                      onPressed: () {                        setState(() {                          _futureAlbum = createAlbum(_controller.text);                        });                      },                    ),                     // RiisedButton is deprecated and shouldn't be used. Use ElevatedButton.                     // RaisedButton(                    //   child: Text('Create Data'),                    //   onPressed: () {                    //     setState(() {                    //       _futureAlbum = createAlbum(_controller.text);                    //     });                    //   },                    // ),                  ],                )              : FutureBuilder<Album>(                  future: _futureAlbum,                  builder: (context, snapshot) {                    if (snapshot.hasData) {                      return Text(snapshot.data!.title);                    } else if (snapshot.hasError) {                      return Text("${snapshot.error}");                    }                     return const CircularProgressIndicator();                  },                ),        ),      ),    );  }}
Output:
sumitgumber28
ankit_kumar_
android
Flutter
Dart
Flutter
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.