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