Enterprise Java

How to make an API call in Flutter (REST API)

In this post, we’ll take a look at how we can make an API call in flutter and consume a simple REST API.

Checkout some of my other posts on Flutter here:

We’ll be creating a simple application in which I’ll make an API call to: https://jsonplaceholder.typicode.com/posts and print out the title in a list.

This’ll demonstrate how you can make an API call in flutter and decode the json using the convert package. So, let’s start.

Create a New Project

First things first, create a new flutter project in Android Studio and name it anything you want.

I’ve named mine: flutter_api_calls.

Next, clear all the boilerplate code that you get. We’ll be writing everything from scratch.

Setting up the project

Next, I’ll be setting up the skeleton of the project. This means adding an AppBar, a Scaffold and writing the main function.

Here’s how it looks

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import 'package:flutter/material.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Api Call'),
    );
  }
}
 
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
 
  final String title;
 
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
 
class _MyHomePageState extends State<MyHomePage> {
   
  @override
  Widget build(BuildContext context) {
    return null;
  }
   
}

Making an API call in Flutter

First we’ll need to include the http package in pubspec.yaml file. Add this line under dependencies where it shows flutter sdk. Here’s how your pubspec.yaml would look like:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
name: flutter_api_calls
description: Flutter application to demonstrate api calls.
 
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
 
environment:
  sdk: ">=2.1.0 <3.0.0"
 
dependencies:
  flutter:
    sdk: flutter
  http: ^0.12.0
 
  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
 
dev_dependencies:
  flutter_test:
    sdk: flutter

Now, import the http package in your main.dart file:

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

Let’s create a function getData() which’ll fetch the data from API. 

1
2
3
Future<String> getData() {
 
}

Async / Await

We’ll be making an API call which can take some time to return a response. This situation calls for asynchronous programming.

Basically, we’ll need to wait till the api call completes and returns a result. As soon as it does, we’ll display the list.

So, this is what we’re gonna do. We’ll make the api call using http object and wait for it to complete.

01
02
03
04
05
06
07
08
09
10
Future<String> getData() async {
  var response = await http.get(
      Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),
      headers: {"Accept": "application/json"});
 
  setState(() {
    data = json.decode(response.body);
  });
  return "Success";
}

To use the await keyword in the function, we’ll need to mark the function async. And any async function has a return type of Future<T> where T can be void, int, string etc.

To decode the data, we’re using :

1
import 'dart:convert';

It provides us with json.decode() method which can be used to deserialize JSON. After we decode the data, we’ll notify the view hierarchy that the data is available and it can populate it into listview.

This was the real meat of the code. Now we’ll need to add a listview to our flutter app.

 

Adding a ListView

Next, we’ll be adding a listview in our flutter app. If you don’t know how to create a listview in flutter, give a quick read to my other post: 

Let’s create a function getList() which’ll return the List if the data is obtained, or a “please wait” message if the response has not yet arrived.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
Widget getList() {
  if (data == null || data.length < 1) {
    return Container(
      child: Center(
        child: Text("Please wait..."),
      ),
    );
  }
  return ListView.separated(
    itemCount: data?.length,
    itemBuilder: (BuildContext context, int index) {
      return getListItem(index);
    },
    separatorBuilder: (context, index) {
      return Divider();
    },
  );
}

Note, that we’re using ListView.separated instead of normal ListView.builder. Reason being that this listview has built in support for a divider item. We don’t need to explicitly check the index.

Building the list item for this is very simple. Just create a Text widget and add some styling to it.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Widget getListItem(int i) {
  if (data == null || data.length < 1) return null;
  if (i == 0) {
    return Container(
      margin: EdgeInsets.all(4),
      child: Center(
        child: Text(
          "Titles",
          style: TextStyle(
            fontSize: 22,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
  }
 
  return Container(
    child: Container(
      margin: EdgeInsets.all(4.0),
      child: Padding(
        padding: EdgeInsets.all(4),
        child: Text(
          data[i]['title'].toString(),
          style: TextStyle(fontSize: 18),
        ),
      ),
    ),
  );
}

You can find the entire code on github: https://github.com/Ayusch/flutter-api-calls

 

Conclusion

This is a really simple and quick example of how you can get started with making an API call in flutter. I although recommend following a proper architecture for your app and not write all the code in one place.

BLoC Architecture for flutter is really powerful. Check it out here: BLoC Architecture in Flutter . This’ll give you an in-depth look on how to write a robust BLoC Architecture for your flutter apps.

*Important*: Join the AndroidVille SLACK  workspace for mobile developers where people share their learnings about everything latest in Tech, especially in Android Development, RxJava, Kotlin, Flutter, and mobile development in general.

Published on Java Code Geeks with permission by Ayusch Jain, partner at our JCG program. See the original article here: How to make an API call in Flutter (REST API)

Opinions expressed by Java Code Geeks contributors are their own.

Ayusch Jain

Ayusch is a Software Engineer currently working in Android Development. He's worked long enough that he's transformed into an Android himself :P. Additionally, he also maintains a community of Android developers called: AndroidVille and writes about Android on his website: https://ayusch.com
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button