Utiliser Hive avec Flutter
Utiliser Hive avec Flutter
-
Objectif
- Comprendre ce qu’est Hive.
- Savoir pourquoi l’utiliser dans une application Flutter.
- Apprendre à installer et configurer Hive.
- Maîtriser les opérations CRUD (Create, Read, Update, Delete).
- Utiliser Hive avec des objets personnalisés grâce aux adapters.
- Découvrir les bonnes pratiques et comparer Hive avec d’autres solutions de persistance.
-
🚀 Qu’est-ce que Hive ?
- Hive est une base de données NoSQL écrite en pur Dart.
- Elle est rapide, légère et offline-first (fonctionne sans internet).
- Hive stocke les données sous forme de paires clé-valeur et est optimisée pour des opérations de lecture-écriture rapides.
- Elle permet de stocker des données localement, sur l’appareil, ainsi que dans le cloud.
- Idéale pour :
- Stocker des paramètres (ex : thème sombre/clair).
- Sauvegarder des favoris.
- Créer un cache local pour éviter les appels API répétés.
- Stocker des objets simples (utilisateurs, produits, etc.).
-
🔧 Installation et configuration
-
Ajouter les dépendances dans
pubspec.yaml
: - Avant de pouvoir utiliser Hive dans notre application Flutter, nous devons ajouter les dépendances nécessaires à notre fichier
pubspec.yaml
. - Ouvrez votre fichier pubspec.yaml et ajoutez les dépendances suivantes :
- Une fois ces dépendances ajoutées, exécutez
Flutter Pub Get
pour les télécharger et les installer. -
Importer et initialiser Hive dans
main.dart
: - Maintenant que nous avons configuré les dépendances, nous pouvons commencer à utiliser Hive dans notre application Flutter.
- La première étape consiste à initialiser Hive en appelant
Hive.initFlutter()
dans notre fonctionmain()
. Nous devons également enregistrer les adaptateurs personnalisés que nous souhaitons utiliser avec Hive. -
📦 Concepts de base dans Hive
- Box : équivalent d’une table ou d’un dictionnaire clé-valeur.
- Clé : Identifiant unique qui peut être de différents types :
- String (chaîne de caractères)
- int (nombre entier)
- double (nombre décimal)
- bool (booléen)
List
(liste)Map
(map)
- Valeur : Donnée stockée qui peut être :
- Types primitifs : String, int, double, bool
- Collections : List, Map
- Objets personnalisés (avec un adapter)
-
📝 Exemple pratique : Gestion des favoris
- a) Sauvegarder un favori :
- b) Lire un favori :
- c) Supprimer un favori :
- d) Observer les changements en temps réel :
-
🎯 Utiliser Hive avec des objets (Adapters)
- a) Définir un modèle :
- b) Générer l’adapter :
- c) Enregistrer l’adapter dans
main.dart
: - d) Utiliser :
-
🛠️ Bonnes pratiques
- Toujours ouvrir les
boxes
avant utilisation. - Utiliser
ValueListenableBuilder
pour une UI réactive. - Éviter de stocker des objets trop complexes → préférer SQLite/Drift.
- Bien choisir les
typeId
uniques pour les adapters. -
📊 Hive vs SQLite vs Drift
-
👉 Conclusion
- Utiliser Hive pour une persistance rapide et simple (favoris, cache, settings).
- Préférer SQLite ou Drift pour des données relationnelles complexes.
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
path_provider: ^2.1.1
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter(); // Initialisation Hive
await Hive.openBox('settings'); // Ouvrir un "box"
runApp(MyApp());
}
👉 Exemple simple :
// Ouvrir ou créer une boîte
var box = await Hive.openBox('settings');
// 🖊️ ÉCRITURE - Stocker des données
box.put('theme', 'dark'); // Clé: 'theme', Valeur: 'dark'
box.put('notifications', true); // Clé: 'notifications', Valeur: true
box.put('user_id', 12345); // Clé: 'user_id', Valeur: 12345
// 📖 LECTURE - Récupérer des données
print(box.get('theme')); // Affiche: dark
print(box.get('notifications')); // Affiche: true
print(box.get('user_id')); // Affiche: 12345
// 🗑️ SUPPRESSION - Supprimer des données
box.delete('theme'); // Supprime la clé 'theme'
box.delete('notifications'); // Supprime la clé 'notifications'
// 🔍 VÉRIFICATION - Vérifier l'existence d'une clé
bool hasTheme = box.containsKey('theme'); // false
// 📊 COMPTAGE - Nombre d'éléments dans la boîte
int itemCount = box.length; // Nombre de paires clé-valeur
// 🧹 NETTOYAGE - Supprimer toutes les données
box.clear(); // Vide toute la boîte
👉 Exemple avec des collections :
var box = await Hive.openBox('user_data');
// Stocker une liste
box.put('favorites', ['apple', 'banana', 'orange']);
// Stocker un map
box.put('user_profile', {
'name': 'John Doe',
'age': 30,
'email': 'john@example.com'
});
// Récupérer les données
List favorites = box.get('favorites');
Map profile = box.get('user_profile');
print(favorites); // [apple, banana, orange]
print(profile['name']); // John Doe
var favoritesBox = Hive.box('favorites');
favoritesBox.put('song1', 'My Favorite Song');
print(favoritesBox.get('song1')); // My Favorite Song
favoritesBox.delete('song1');
ValueListenableBuilder(
valueListenable: Hive.box('favorites').listenable(),
builder: (context, box, widget) {
return ListView(
children: box.values.map((fav) => Text(fav)).toList(),
);
},
);
import 'package:hive/hive.dart';
part 'user_model.g.dart';
@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
String id;
@HiveField(1)
String name;
User({required this.id, required this.name});
}
flutter packages pub run build_runner build
Hive.registerAdapter(UserAdapter());
await Hive.openBox('users');
var userBox = Hive.box('users');
// Ajouter un utilisateur
userBox.put('u1', User(id: '1', name: 'Alice'));
// Lire un utilisateur
User? u = userBox.get('u1');
print(u?.name); // Alice
Critère | Hive (NoSQL) | SQLite (sqflite) | Drift (ORM) |
---|---|---|---|
Performance | 🚀 Très rapide | Bonne | Bonne mais typée |
Structure | Clé-valeur | Relationnelle | Relationnelle typée |
Simplicité | Très simple | Moyenne (SQL à écrire) | Plus complexe (build_runner) |
Idéal pour | Cache, favoris, settings | Données structurées | Projets complexes |