Skip to content
Related Articles

Related Articles

Flutter – Sending Data To The Internet

Improve Article
Save Article
  • Difficulty Level : Expert
  • Last Updated : 23 Jun, 2022
Improve Article
Save Article

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:

  1. Import the http package
  2. Send data to the server through the http package
  3. Change the response into custom dart object
  4. Display the response

Importing The http Package:

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

dependencies

After the installation add the dependency to the pubsec.yml file as shown below:

import 'package:http/http.dart' as http;

Send Data to the Server:

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(
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'title': title,
    }),
  );


Converting the Response:

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'],
    );
  }
}


 
 

Convert http.Response to an Album:

 

Now, follow the below steps to update the fetchAlbum() function to return a Future<Album>:

 

  1. Use the dart: convert package to convert the response body into a JSON Map.
  2. Use the fromJSON() factory method to convert JSON Map into Album if the server returns an OK response with a status code of 200.
  3. 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(
    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!');
  }
}


Ask User For an Album Title:

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);
    //     });
    //   },
    // ),
  ],
)


Display the Response:

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(
    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:


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!