Hive és una base de dades NoSQL lleugera i ràpida per a Flutter i Dart. És ideal per a emmagatzematge local en aplicacions mòbils gràcies a la seva facilitat d'ús i rendiment. En aquesta secció, aprendrem com configurar i utilitzar Hive per emmagatzemar dades localment en una aplicació Flutter.
Continguts
Introducció a Hive
Hive és una base de dades NoSQL que ofereix les següents característiques:
- Rendiment Alt: Optimitzada per a operacions ràpides.
- Tipus Fort: Suporta tipus de dades personalitzats.
- Sincronització: Suporta operacions síncrones i asíncrones.
- Persistència: Emmagatzema dades de manera persistent en el dispositiu.
Configuració de Hive
Pas 1: Afegir Dependències
Afegim les dependències necessàries al fitxer pubspec.yaml:
dependencies:
flutter:
sdk: flutter
hive: ^2.0.0
hive_flutter: ^1.0.0
dev_dependencies:
hive_generator: ^1.0.0
build_runner: ^2.0.0Pas 2: Inicialitzar Hive
Inicialitzem Hive en el fitxer principal de l'aplicació (main.dart):
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
await Hive.initFlutter();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Hive Example')),
body: Center(child: Text('Hello, Hive!')),
),
);
}
}Definició de Models
Per emmagatzemar objectes personalitzats, hem de definir models i generar adaptadors.
Pas 1: Crear la Classe del Model
Creem una classe per al model que volem emmagatzemar. Per exemple, un model Contact:
import 'package:hive/hive.dart';
part 'contact.g.dart';
@HiveType(typeId: 0)
class Contact {
@HiveField(0)
final String name;
@HiveField(1)
final int age;
Contact(this.name, this.age);
}Pas 2: Generar l'Adaptador
Executem el següent comandament per generar l'adaptador:
Això generarà un fitxer contact.g.dart amb l'adaptador necessari.
Pas 3: Registrar l'Adaptador
Registrem l'adaptador en el fitxer principal (main.dart):
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'contact.dart';
void main() async {
await Hive.initFlutter();
Hive.registerAdapter(ContactAdapter());
runApp(MyApp());
}Operacions Bàsiques amb Hive
Obrir una Caixa
Abans de realitzar operacions, hem d'obrir una caixa:
Afegir Dades
Afegim un objecte Contact a la caixa:
Llegir Dades
Llegim dades de la caixa:
Actualitzar Dades
Actualitzem un objecte existent:
Eliminar Dades
Eliminem un objecte de la caixa:
Exemple Pràctic
A continuació, implementarem un exemple pràctic que mostra una llista de contactes i permet afegir-ne de nous.
Pas 1: Crear la Interfície d'Usuari
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'contact.dart';
void main() async {
await Hive.initFlutter();
Hive.registerAdapter(ContactAdapter());
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ContactListScreen(),
);
}
}
class ContactListScreen extends StatefulWidget {
@override
_ContactListScreenState createState() => _ContactListScreenState();
}
class _ContactListScreenState extends State<ContactListScreen> {
Box<Contact> contactBox;
@override
void initState() {
super.initState();
_openBox();
}
Future<void> _openBox() async {
contactBox = await Hive.openBox<Contact>('contactsBox');
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Contacts')),
body: contactBox == null
? Center(child: CircularProgressIndicator())
: ValueListenableBuilder(
valueListenable: contactBox.listenable(),
builder: (context, Box<Contact> box, _) {
if (box.values.isEmpty) {
return Center(child: Text('No contacts'));
}
return ListView.builder(
itemCount: box.length,
itemBuilder: (context, index) {
final contact = box.getAt(index);
return ListTile(
title: Text(contact.name),
subtitle: Text('Age: ${contact.age}'),
);
},
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () => _addContact(),
child: Icon(Icons.add),
),
);
}
Future<void> _addContact() async {
final newContact = Contact('New Contact', 30);
await contactBox.add(newContact);
}
}Exercicis Pràctics
- Afegir Funcionalitat d'Eliminació: Modifica l'exemple pràctic per permetre l'eliminació de contactes.
- Editar Contactes: Afegeix la funcionalitat per editar els contactes existents.
- Persistència de Dades: Assegura't que les dades es mantenen després de tancar i reobrir l'aplicació.
Solucions
- Funcionalitat d'Eliminació:
ListTile(
title: Text(contact.name),
subtitle: Text('Age: ${contact.age}'),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: () => box.deleteAt(index),
),
);- Editar Contactes:
Future<void> _editContact(int index) async {
final contact = contactBox.getAt(index);
final updatedContact = Contact(contact.name, contact.age + 1); // Exemple d'actualització
await contactBox.putAt(index, updatedContact);
}- Persistència de Dades: Hive ja maneja la persistència de dades automàticament. Assegura't que la caixa s'obre correctament en
initState.
Conclusió
En aquesta secció, hem après a utilitzar Hive per a l'emmagatzematge local en aplicacions Flutter. Hem cobert la configuració inicial, la definició de models, les operacions bàsiques i hem implementat un exemple pràctic. A més, hem proporcionat exercicis per reforçar els conceptes apresos. Amb Hive, podem gestionar dades localment de manera eficient i senzilla.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació
