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.0
Pas 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ó