Get Data dari Internet di Flutter

Get Data dari Internet di Flutter

Di dunia saat ini, kebanyakan aplikasi sangat bergantung pada pengambilan data dari server melalui internet. Dalam Flutter, layanan seperti itu disediakan oleh paket http.

Mengimport Paket http

Pertama, tambahkan paket http ke dalam file pubspec.yaml seperti dibawah ini

Setelah menambahkan http di pubspec.yaml lalu ketikkan command “flutter pub get” pada terminal agar flutter menginstal dependency paket yang telah ditambahkan pada pubspec.yaml ke dalam aplikasi.

flutter pub get

Setelah menambahkan paket di pubspec.yaml, selanjutnya import dependency http di file dart yang akan menggunakan http dengan kode sebagai berikut.

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

Mengambil Data Dari Internet

Kita dapat menggunakan fungsi http.get untuk mengambil data album contoh dari JSONPlaceholder seperti yang ditunjukkan di bawah ini:

Future fetchAlbum() {
  return http.get('https://jsonplaceholder.typicode.com/albums/2');
}

Konversi Data Response

Konversikan data response dari response.body menjadi object Dart, sehingga data response dari internet dapat diolah dengan mudah. Untuk itu buatlah satu class Album yang bisa menampung data response dan satu fungsi fromJson yang dapat secara otomatis mengambil semua data response:

class Album {
  final int userId;
  final int id;
  final String title;

  Album({required this.userId, required this.id, required this.title});

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

Tampilkan Data

Sekarang, ikuti langkah-langkah di bawah ini untuk memperbarui fungsi fetchAlbum agar mengembalikan object Future<Album>:

  1. Gunakan paket dart:convert untuk mengonversi isi body respons menjadi Map JSON.
  2. Gunakan fungsi fromJSON() untuk mengonversi Map JSON menjadi object Album.
Future fetchAlbum() async {
  final response = await http
      .get(Uri.parse('https://jsonplaceholder.typicode.com/albums/2'));

  if (response.statusCode == 200) {
    return Album.fromJson(json.decode(response.body));
  } else {
    throw Exception('Failed to load album');
  }
}

Gunakan fungsi di atas untuk mengambil data seperti yang ditunjukkan di bawah ini:

class _MyAppState extends State {
  late Future futureAlbum;

  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }

Menampilkan Data

Gunakan widget FutureBuilder untuk menampilkan data pada layar seperti yang ditunjukkan di bawah ini:

FutureBuilder(
            future: futureAlbum,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Container(
                  padding: const EdgeInsets.all(12),
                  width: 150,
                  height: 150,
                  decoration: BoxDecoration(
                    color: Colors.amber,
                    borderRadius: BorderRadius.circular(18),
                  ),
                  child: Center(
                    child: Text(
                      snapshot.data!.title,
                      style: const TextStyle(
                        fontWeight: FontWeight.bold,
                        fontSize: 24,
                      ),
                      textAlign: TextAlign.center,
                    ),
                  ),
                );
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }
              return const CircularProgressIndicator();
            },
          ),

Berikut ini adalah source code lengkap setelah mengikuti langkah-langkah di atas.

import 'dart:async';
import 'dart:convert';

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

Future fetchAlbum() async {
  final response = await http
      .get(Uri.parse('https://jsonplaceholder.typicode.com/albums/2'));

//Pengondisian yang digunakan untuk mengambil tindakan yang tepat
//berdasarkan pada respons dari server.
  if (response.statusCode == 200) {
    return Album.fromJson(json.decode(response.body));
  } else {
    throw Exception('Failed to load album');
  }
}

class Album {
  final int userId;
  final int id;
  final String title;

  Album({required this.userId, required this.id, required this.title});

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State createState() => _MyAppState();
}

class _MyAppState extends State {
  late Future futureAlbum;

  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fetching Data',
      theme: ThemeData(
        brightness: Brightness.dark,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Nextgen Tutorial'),
        ),
        body: Center(
          child: FutureBuilder(
            future: futureAlbum,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Container(
                  padding: const EdgeInsets.all(12),
                  width: 150,
                  height: 150,
                  decoration: BoxDecoration(
                    color: Colors.amber,
                    borderRadius: BorderRadius.circular(18),
                  ),
                  child: Center(
                    child: Text(
                      snapshot.data!.title,
                      style: const TextStyle(
                        fontWeight: FontWeight.bold,
                        fontSize: 24,
                      ),
                      textAlign: TextAlign.center,
                    ),
                  ),
                );
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }
              return const CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

Tinggalkan Balasan

Keranjang Belanja0
Keranjang belanja kosong ...
0