Integração com APIs e Bancos de Dados no Flutter: Guia Completo

Introdução

O Flutter oferece ferramentas poderosas para integrar aplicativos a APIs e bancos de dados. Combinando pacotes como http para chamadas REST e sqflite ou hive para armazenamento local, é possível criar apps robustos que interagem com dados externos de forma eficiente.

Neste tutorial, você aprenderá a configurar e realizar integrações com APIs REST e bancos de dados locais no Flutter, com exemplos práticos e boas práticas.

1. Configurando o Projeto

Adicione os pacotes necessários ao arquivo pubspec.yaml:


dependencies:
  http: ^0.15.0
  sqflite: ^2.0.0
  path: ^1.8.0

Depois, execute:


flutter pub get

2. Integração com APIs REST

Vamos criar uma função para buscar dados de uma API REST pública:


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

Future<List> fetchPosts() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));

  if (response.statusCode == 200) {
    return json.decode(response.body);
  } else {
    throw Exception('Erro ao buscar dados da API');
  }
}

Você pode usar essa função para exibir dados em um widget:


import 'package:flutter/material.dart';

class PostsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Posts')),
      body: FutureBuilder<List>(
        future: fetchPosts(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return Center(child: Text('Erro: \${snapshot.error}'));
          } else {
            final posts = snapshot.data!;
            return ListView.builder(
              itemCount: posts.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(posts[index]['title']),
                  subtitle: Text(posts[index]['body']),
                );
              },
            );
          }
        },
      ),
    );
  }
}

3. Integração com Bancos de Dados Locais

Vamos configurar o sqflite para criar e acessar um banco de dados local:


import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future initializeDatabase() async {
  final path = await getDatabasesPath();
  final dbPath = join(path, 'app_database.db');

  return openDatabase(
    dbPath,
    onCreate: (db, version) {
      return db.execute(
        'CREATE TABLE posts(id INTEGER PRIMARY KEY, title TEXT, body TEXT)',
      );
    },
    version: 1,
  );
}

Future insertPost(Database db, Map<String, dynamic> post) async {
  await db.insert('posts', post, conflictAlgorithm: ConflictAlgorithm.replace);
}

Future<List<Map<String, dynamic>>> fetchLocalPosts(Database db) async {
  return await db.query('posts');
}

Use as funções acima para salvar e recuperar dados localmente:


void main() async {
  final db = await initializeDatabase();

  // Inserindo um post
  await insertPost(db, {'id': 1, 'title': 'Post Local', 'body': 'Este é um post salvo localmente.'});

  // Recuperando posts
  final posts = await fetchLocalPosts(db);
  print(posts);
}

4. Combinação de APIs e Bancos de Dados

Uma prática comum é sincronizar dados de uma API com o banco de dados local. Aqui está um exemplo de como fazer isso:


Future syncPosts(Database db) async {
  final posts = await fetchPosts();
  for (var post in posts) {
    await insertPost(db, {
      'id': post['id'],
      'title': post['title'],
      'body': post['body'],
    });
  }
}

Você pode usar essa função ao iniciar o aplicativo para garantir que o banco de dados local esteja sempre atualizado.

5. Boas Práticas

  • Use pacotes como dio para funcionalidades avançadas em chamadas HTTP.
  • Implemente estratégias de cache para reduzir chamadas frequentes à API.
  • Crie repositórios para abstrair lógica de banco de dados e API.

Publicar comentário