| Kết nối API REST trong Flutter: Hướng dẫn lấy dữ liệu từ Server

Được viết bởi thanhdt vào ngày 27/01/2026 lúc 17:11 | 29 lượt xem

Một ứng dụng “đóng kín” (Offline) sẽ rất hạn chế. Sức mạnh thực sự nằm ở việc kết nối Internet để lấy dữ liệu: Thời tiết, Tin tức, Giá vàng…

Trong Flutter, việc gọi API (Application Programming Interface) cực kỳ đơn giản nhờ các thư viện hỗ trợ tận răng. Bài viết này sẽ hướng dẫn bạn cách lấy dữ liệu từ một API miễn phí và hiển thị lên màn hình.

1. Chuẩn bị thư viện

Chúng ta có 2 sự lựa chọn phổ biến:
* http: Thư viện chính chủ của Google. Đơn giản, dễ dùng.
* dio: Thư viện bên thứ 3 mạnh mẽ hơn (có Interceptor, Cancel Token…).

Trong bài này, mình sẽ dùng gói http cho đơn giản.
Thêm vào file pubspec.yaml:

dependencies:
  http: ^1.1.0

2. Quy trình “3 bước” để lấy dữ liệu

Bước 1: Gọi API (Fetch Data)

Sử dụng hàm http.get() để gửi yêu cầu lên Server. Vì việc này tốn thời gian (mạng lag), nên chúng ta phải dùng async/await.

Bước 2: Giải mã JSON (Parse JSON)

Server trả về một chuỗi String loằng ngoằng. Bạn cần dùng jsonDecode() để biến nó thành Map (Key-Value) hoặc Object trong Dart.

Bước 3: Hiển thị lên UI (FutureBuilder)

Dùng Widget FutureBuilder để xử lý 3 trạng thái:
* Đang tải (Loading) -> Hiện vòng quay.
* Lỗi (Error) -> Hiện thông báo lỗi.
* Thành công (Success) -> Hiện dữ liệu.

3. Code mẫu đầy đủ

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

Future<List<dynamic>> fetchPosts() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
  if (response.statusCode == 200) {
    return jsonDecode(response.body);
  } else {
    throw Exception('Failed to load posts');
  }
}

class PostList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<dynamic>>(
      future: fetchPosts(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return ListView.builder(
            itemCount: snapshot.data!.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(snapshot.data![index]['title']),
              );
            },
          );
        } else if (snapshot.hasError) {
          return Text("${snapshot.error}");
        }
        return CircularProgressIndicator();
      },
    );
  }
}

Lấy dữ liệu về rồi, nhưng nếu người dùng tắt mạng thì sao? App sẽ trắng trơn à?
Giải pháp là lưu dữ liệu vào máy (Cache) để xem offline.

Bài tiếp theo sẽ hướng dẫn bạn cách Lưu dữ liệu local trong Flutter bằng SharedPreferences và SQLite.

👉 Lưu dữ liệu local trong Flutter: SharedPreferences & SQLite


Đón xem bài tiếp theo: Lưu dữ liệu local trong Flutter: Khi nào dùng cái nào?**