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 Getpour 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 
boxesavant utilisation. - Utiliser 
ValueListenableBuilderpour une UI réactive. - Éviter de stocker des objets trop complexes → préférer SQLite/Drift.
 - Bien choisir les 
typeIduniques 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 | 
