Notifications push Flutter avec Supabase et Entrig

Entrig
Ib Entrig Team

Notifications push Flutter avec Supabase et Entrig

Dans ce guide, nous allons ajouter des notifications push à une application Flutter avec Supabase et Entrig.

Entrig est un outil conçu pour Supabase : il envoie des notifications à partir des événements de base de données, sans code backend. Nous utiliserons une application de chat de groupe. Suivez l’application exemple sur GitHub.


Prérequis

  • Un compte Supabase avec un projet
  • Un compte Entrig : inscrivez-vous sur entrig.com
  • Le JSON d’un compte de service Firebase pour les push Android
  • Une clé d’authentification APNs et un compte Apple Developer pour iOS

Installation

1. Installez le package

Ajoutez Entrig à pubspec.yaml :

dependencies:
  entrig: ^latest_version

Exécutez flutter pub get.

2. Configurez les plateformes

Android : aucune configuration supplémentaire n’est nécessaire.

iOS : exécutez cette commande afin de configurer automatiquement les capacités :

flutter pub run entrig:setup

Elle met à jour AppDelegate, Runner.entitlements et Info.plist, avec des sauvegardes automatiques.

3. Initialisez l’application

Récupérez votre clé API dans les réglages du tableau de bord Entrig, puis ajoutez-la à main.dart :

await Entrig.init(apiKey: 'YOUR_ENTRIG_API_KEY');

4. Enregistrez l’utilisateur

À la connexion, enregistrez l’appareil avec l’identifiant utilisateur, généralement celui de Supabase Auth :

final user = Supabase.instance.client.auth.currentUser;
if (user != null) {
  await Entrig.registerUser(userId: user.id);
}

Un ID personnalisé convient aussi s’il correspond à l’ID stocké dans la table users. Entrig s’en sert pour associer les appareils aux lignes de la base. À la déconnexion :

await Entrig.unregisterUser();

Consultez la documentation du SDK Flutter pour les détails propres aux plateformes.


Base de données de l’application

Le schéma est celui d’un chat de groupe : les utilisateurs créent des groupes, les rejoignent et envoient des messages.

group_members
group_id
uuid
user_id
uuid
created_at
timestamptz
groups
id
uuid
created_at
timestamptz
name
text
created_by
uuid
users
id
uuid
created_at
timestamptz
name
text
messages
id
uuid
created_at
timestamptz
content
text
user_id
uuid
group_id
uuid

users est le point de départ. groups.created_by désigne le propriétaire ; group_members relie utilisateurs et groupes ; messages contient le texte, le groupe et l’expéditeur.

Chaque notification s’appuie sur une relation différente :

  1. Un membre rejoint → group_members → groups → created_by vers le propriétaire (un à un).
  2. Nouveau message → diffusion via group_members vers tous les membres sauf l’expéditeur (un à plusieurs).
  3. Nouveau groupe → tous les utilisateurs enregistrés, sauf le créateur (diffusion générale).

Ces trois modèles — direct, indirect par table de jointure et diffusion — couvrent la plupart des cas d’usage.

Créer les notifications

Dans Entrig, une notification est définie par Trigger (l’événement), Users (les destinataires) et Message (le contenu).

Direct : arrivée d’un membre

La nouvelle ligne group_members contient le user_id de la personne qui arrive et le group_id, mais pas l’ID du propriétaire. Entrig suit la chaîne de clés étrangères group_id → groups → created_by → users.id. C’est une connexion Direct : un événement, un destinataire. Ajoutez une condition pour ignorer l’ajout automatique du propriétaire lorsqu’il crée son groupe.

  • Table / événement : group_members / INSERT
  • Condition : group_members.user_id ≠ groups.created_by
  • Chemin utilisateur : group_members.group_id → groups → created_by → users.id
  • Type : new_member; champs : groups.name, users.name, group_members.group_id

Indirect via une table de jointure : nouveau message

Lorsqu’un message est envoyé, tous les membres du groupe doivent être avertis, sauf l’expéditeur. L’insertion est dans messages, mais les destinataires se trouvent dans group_members. Entrig prend le group_id, retrouve chaque ligne correspondante, puis résout chaque user_id vers un appareil enregistré.

  • Table / événement : messages / INSERT
  • Connexion : Indirect via Join Table
  • Chemin : messages.group_id → group_members → user_id → users.id
  • Filtre destinataire : group_members.user_id ≠ messages.user_id
  • Type : new_message; champs : messages.content, users.name, messages.group_id, groups.name

Broadcast : nouveau groupe

Quand un groupe est créé, Entrig peut notifier tous les utilisateurs de la table users. Il n’y a pas de table de jointure : c’est une connexion Broadcast. Excluez le créateur, qui n’a pas besoin d’être notifié de son propre groupe.

  • Table / événement : groups / INSERT
  • Connexion : Broadcast (tous les utilisateurs de users)
  • Filtre : users.id ≠ groups.created_by
  • Type : new_group; champs : groups.id, groups.name, users.name

Une fois créée, Entrig génère automatiquement le trigger et la fonction de base de données dans le projet Supabase. Aucun déploiement manuel n’est nécessaire.

Gérer les notifications dans le SDK

Les trois notifications transportent un ID de groupe. Utilisez event.type pour ouvrir le bon écran :

Entrig.onNotificationOpened.listen((NotificationEvent event) {
  switch (event.type) {
    case 'new_member':
      // afficher un dialogue et ouvrir event.data['group_id']
      break;
    case 'new_message':
      // ouvrir directement le chat event.data['group_id']
      break;
    case 'new_group':
      // afficher un dialogue et ouvrir le groupe event.data['id']
      break;
  }
});

event.type est la valeur définie dans le tableau de bord ; event.data contient les champs choisis : IDs, noms et contenu du message.

Conclusion

Direct, Indirect et Broadcast correspondent aux trois façons fondamentales dont les destinataires se rapportent à un événement dans une base relationnelle. Après avoir choisi le modèle, le reste est de la configuration. La même logique fonctionne pour les commandes, les tâches et les annonces produit.

Retrouvez la référence complète du SDK Flutter et le guide anglais Push Notifications for Supabase.