Supabase-Backend einrichten

Erstelle ein Supabase-Projekt. Für eine Aufgaben-App erstellst du folgende Tabelle:

CREATE TABLE tasks ( id bigserial PRIMARY KEY, title text NOT NULL, completed boolean DEFAULT false, user_id uuid REFERENCES auth.users(id), created_at timestamptz DEFAULT now() );

ALTER TABLE tasks ENABLE ROW LEVEL SECURITY; CREATE POLICY "user owns tasks" ON tasks FOR ALL USING (auth.uid() = user_id);

Row Level Security (RLS) ist entscheidend für DSGVO-Konformität, mit RLS kann jeder Nutzer nur seine eigenen Zeilen sehen und bearbeiten, direkt auf Datenbankebene. Das ist einer der Gründe, warum wir für deutsche Kunden mit DSGVO-Anforderungen immer Supabase gegenüber Firebase bevorzugen. Kopiere deine Supabase-Projekt-URL und den Anon-Key, du brauchst sie in FlutterFlow.

FlutterFlow mit Supabase verbinden

In FlutterFlow gehe zu Settings → Supabase. Füge deine Supabase-URL und den Anon-Key ein. FlutterFlow authentifiziert sich und zeigt dein Datenbankschema.

Du siehst deine Tasks-Tabelle mit allen Spalten. FlutterFlow generiert automatisch typisierte Query-Builder für jede Tabelle, kein SQL im Frontend nötig. Das ist einer der großen Vorteile dieser Kombination: Du gestaltest die UI visuell in FlutterFlow, während Supabase die gesamte Datenlogik übernimmt.

Tipp: Benenne dein Supabase-Projekt so, dass es das Kundenprojekt widerspiegelt, z.B. "company-app-prod". Das erleichtert die Wartung und macht es für alle Teammitglieder eindeutig.

Authentifizierung aufbauen

Verwende FlutterFlows Supabase-Auth-Aktionen für Login und Registrierung. Erstelle: 1. Eine Login-Seite mit E-Mail-/Passwortfeldern und einem "Anmelden"-Button 2. Eine Registrierungsseite mit E-Mail, Passwort und Passwort-Bestätigung 3. Verknüpfe die Button-OnTap-Aktionen mit "Log In with Email" und "Create Account with Email" (beide Supabase-Auth-Aktionen)

Richte die "Initial Page"-Logik ein: Wenn der Nutzer authentifiziert ist → Startseite, sonst → Login-Seite.

Für Apps, die auf deutsche Unternehmenskunden ausgerichtet sind, kannst du auch eine ELSTER-Authentifizierung oder Single Sign-On mit dem Microsoft-Azure-AD des Unternehmens via Supabase SAML ergänzen, das erhöht die Glaubwürdigkeit bei Enterprise-Kunden sofort.

FlutterFlow-Auth mit Supabase: Über E-Mail/Passwort hinaus

E-Mail- und Passwort-Authentifizierung deckt die meisten Anwendungsfälle ab, aber FlutterFlow unterstützt die komplette Palette der Supabase-Auth-Provider. Magic-Link-Authentifizierung (passwortlose E-Mail-Anmeldung) ist mit einem Klick konfiguriert und verbessert die mobile Konversionsrate deutlich, denn Nutzer müssen sich keine Passwörter merken. OAuth-Provider (Google, Apple, GitHub) werden über Supabase unterstützt und sind für jede Consumer-App unverzichtbar: Apple Sign-In ist laut App-Store-Richtlinien verpflichtend, sobald du eine andere Social-Login-Option anbietest.

Phone/OTP-Authentifizierung über Supabase nutzt im Hintergrund Twilio. Füge in FlutterFlow die Aktion "Send OTP" zu deinem Telefon-Eingabebildschirm hinzu und "Verify OTP" zu deinem Code-Eingabebildschirm. Supabase verwaltet die Twilio-Zugangsdaten in deinem Dashboard, kein Code nötig.

Ein entscheidendes Detail: Damit Supabase-Auth in einer veröffentlichten FlutterFlow-App korrekt funktioniert, musst du das URL-Schema deiner App in Supabase unter Authentication → URL Configuration whitelisten. Für iOS-Apps sieht das etwa so aus: com.yourcompany.yourapp://login-callback. Wird dieser Schritt vergessen, schlagen OAuth-Redirects nach der App-Store-Einreichung stillschweigend fehl, ein sehr häufiger Stolperstein bei der ersten FlutterFlow + Supabase-Bereitstellung.

Aufgabenliste bauen

Erstelle eine ListView-Komponente. Setze die Datenquelle auf deine Supabase-Tasks-Tabelle. Füge einen Filter hinzu: user_id = currentAuthUser.uid (FlutterFlow füllt das automatisch aus).

Für jedes Listenelement: zeige den Aufgabentitel, eine Checkbox für den Abgeschlossen-Status und einen Löschen-Button. Verknüpfe die Checkbox mit einer Supabase-UPDATE-Aktion (setze completed = true/false). Verknüpfe den Löschen-Button mit einer Supabase-DELETE-Aktion.

Design-Tipp: Füge einen leeren Zustand mit einer handlungsorientierten Nachricht hinzu, z.B. "Noch keine Aufgaben. Erstelle deine erste!", anstatt einer leeren Liste. Das verbessert die Aktivierungsrate deutlich und wirkt professionell.

Echtzeit-Subscriptions hinzufügen

In FlutterFlows Supabase-Einstellungen aktiviere Realtime für die Tasks-Tabelle. In deiner Aufgabenlisten-Komponente aktiviere "Realtime" in der Datenquelle.

Wenn eine Aufgabe jetzt hinzugefügt, aktualisiert oder gelöscht wird (von beliebigen Geräten), aktualisiert sich deine Liste automatisch, kein manuelles Polling nötig. Das ist eine der Stärken von Supabase gegenüber traditionellem REST: du bekommst Live-Updates ohne zusätzliche Infrastruktur.

Für Team-Apps und Kollaborationsfunktionen, zum Beispiel das Teilen von Aufgaben mit Kollegen, kannst du dies mit Supabase Presence erweitern, um anzuzeigen, welche Nutzer gerade online sind.

Echtzeit-Daten in FlutterFlow: Architektur und Grenzen

FlutterFlows Supabase-Realtime-Integration nutzt die logische Replikation von PostgreSQL. Wenn du Realtime für eine Tabelle in Supabase aktivierst, werden Änderungen über ein Websocket an alle verbundenen Clients übertragen. FlutterFlow verwaltet den Subscription-Lebenszyklus automatisch: Abonnieren beim Mounten des Widgets, Abbestellen beim Dispose, was die Memory-Leaks und doppelten Subscriptions verhindert, die bei handgeschriebenen Flutter-Apps häufig vorkommen.

Die praktische Grenze: Supabase Realtime erlaubt im kostenlosen Tarif 200 gleichzeitige Verbindungen. Der Pro-Plan erhöht dieses Limit auf 500. Für eine mobile App mit 1.000 aktiven Nutzern, aber geringer gleichzeitiger Nutzung (typisch für B2B-Tools), reicht das aus. Für Consumer-Apps mit hoher Gleichzeitigkeit solltest du Supabase Pro einplanen und die Connections-Metrik im Supabase-Dashboard im Blick behalten.

Realtime in FlutterFlow funktioniert auch für Presence-Funktionen, die anzeigen, welche Nutzer gerade online sind. Implementiere dies über die Presence-Channel-API von Supabase. Das ist etwas aufwendiger als einfache Tabellen-Subscriptions und erfordert derzeit Custom-Action-Code in FlutterFlow, eröffnet aber Kollaborationsfunktionen wie "Nutzer X sieht sich diesen Datensatz gerade an", ganz ohne zusätzliche Backend-Infrastruktur.

Push-Benachrichtigungen einrichten

Push-Benachrichtigungen in FlutterFlow-Apps benötigen Firebase Cloud Messaging (FCM) für iOS und Android gleichermaßen. Auch bei iOS, wo der Apple Push Notification Service (APNS) den eigentlichen Transport übernimmt, leitet FlutterFlow für plattformübergreifende Konsistenz alles über FCM.

Einrichtungsschritte: Erstelle ein Firebase-Projekt, lade die Dateien google-services.json (Android) und GoogleService-Info.plist (iOS) herunter und lade beide in FlutterFlow unter Settings → Firebase hoch. Aktiviere Cloud Messaging in der Firebase-Konsole. Füge in deiner Supabase-Datenbank eine device_tokens-Tabelle hinzu, um FCM-Tokens pro Nutzer zu speichern, du schreibst den Token beim App-Start mit einer FlutterFlow-Custom-Action nach Supabase.

Um eine Benachrichtigung zu senden, rufst du die FCM-HTTP-v1-API aus einem Make- oder n8n-Workflow auf, der durch einen Supabase-Webhook ausgelöst wird. Beispiel: Eine neue Nachricht in einer Chat-App löst einen Supabase-Webhook aus → Make-Szenario → FCM-API-Aufruf → Benachrichtigung wird auf dem Gerät des Empfängers zugestellt. Dieses Muster deckt 95% der Benachrichtigungsanforderungen ohne serverseitigen Code ab. Für Benachrichtigungen mit hohem Volumen (10.000+ pro Tag) solltest du auf einen dedizierten Dienst wie OneSignal umsteigen, der eine native Supabase-Integration und ein FlutterFlow-Plugin bietet.

Überlegungen zum Offline-Modus

Ein vollständiger Offline-Modus in FlutterFlow (lokales Zwischenspeichern von Daten und Synchronisation bei Wiederherstellung der Verbindung) erfordert Custom Code und ist nicht von Haus aus verfügbar. Was FlutterFlow nativ unterstützt, ist eine geordnete Verschlechterung (Graceful Degradation): Anzeige eines "Keine Verbindung"-Zustands über das ConnectivityStatus-Widget und Blockieren von Aktionen, die eine Netzwerkverbindung erfordern. Für die meisten B2B-Mobile-Tools (Außendienst-Apps, Inspektions-Checklisten, Lieferungs-Apps) reicht dieses grundlegende Offline-Bewusstsein aus.

Für echte Offline-First-Funktionalität, bei der Nutzer Datensätze ohne Verbindung erstellen und bearbeiten können und Änderungen automatisch synchronisiert werden, musst du eine lokale Persistenzschicht integrieren. Der empfohlene Ansatz: Nutze Supabase Edge Functions, um einen REST-Endpunkt bereitzustellen, den deine App bei Wiederverbindung abfragt, kombiniert mit FlutterFlows lokalem State-Management, um Änderungen in eine Warteschlange zu stellen. Das erfordert Custom-Dart-Code (FlutterFlows Custom-Widget-/Action-Funktion), ist aber auch ohne einen vollwertigen Flutter-Entwickler umsetzbar.

Eine einfachere Alternative: Grenze die Offline-Anforderungen deiner App bereits beim Design sorgfältig ein. Die meisten Enterprise-Mobile-Apps haben nur eine kleine Anzahl wirklich kritischer Offline-Funktionen (meine zugewiesenen Aufgaben ansehen, einen Eintrag als erledigt markieren), die sich mit FlutterFlows App-State-Variablen und einem Sync-on-Open-Muster umsetzen lassen, ganz ohne eine vollständige Offline-Engine zu bauen.

Im App Store und Google Play veröffentlichen

In FlutterFlow gehe zu Run → Build → iOS und Android.

Für iOS: Du brauchst ein Apple Developer-Konto (99 USD/Jahr). FlutterFlow generiert die .ipa-Datei. Einreichen über Xcode oder Transporter. Die App Store-Überprüfung dauert für die erste Einreichung 1-3 Tage.

Für Android: FlutterFlow generiert eine signierte .aab-Datei. Einreichen über die Google Play Console. Updates werden normalerweise innerhalb von 24 Stunden überprüft.

Ein wichtiger Schritt für deutsche Apps: Stelle sicher, dass deine App Store- und Google Play-Beschreibung auf Deutsch ist, wenn deine primäre Zielgruppe deutschsprachig ist. Das verbessert die organische Sichtbarkeit in den App-Stores erheblich.

App-Store-Einreichung mit FlutterFlow: Was dich erwartet

FlutterFlows Build-System generiert ein Standard-Flutter-Projekt und kompiliert es über die eigene Cloud-Build-Infrastruktur. Bei der ersten App-Store-Einreichung prüft Apples Review-Team deine App auf Einhaltung der Human Interface Guidelines, der Datenschutzanforderungen und der App Store Review Guidelines. Häufige Ablehnungsgründe für mit FlutterFlow gebaute Apps: fehlende Datenschutzerklärungs-URL (auch bei kostenlosen Apps erforderlich), unvollständige App-Metadaten (Screenshots in falschen Abmessungen, Apple verlangt bestimmte Größen für unterschiedliche Geräteklassen) und eine unzureichende Beschreibung der Nutzerdatenverarbeitung im Privacy-Nutrition-Label.

Sei beim Privacy-Nutrition-Label konkret bezüglich der Datenerfassung durch Supabase. Wenn du E-Mail-Adressen und Nutzungsdaten erfasst, gib das im Bereich "Data Use" von App Store Connect an. Supabases Auth-System erfasst standardmäßig Gerätemetadaten, das musst du ebenfalls offenlegen. Die App-Store-Überprüfung dauert für Updates in der Regel 24 bis 48 Stunden. Die erste Einreichung einer neuen App dauert 1 bis 5 Tage und kann bei Apps in regulierten Kategorien (Gesundheit, Finanzen, Kinder) einen Review-Call beinhalten.

Die Google-Play-Überprüfung ist in der Regel schneller (4 bis 24 Stunden) und weniger streng bei visuellen Gestaltungsanforderungen, verlangt aber ebenso strikt Data-Safety-Angaben. Nutze FlutterFlows TestFlight-/Internal-Testing-Distribution, um deine App vor der öffentlichen Einreichung zu validieren, das spart Zyklen, da du Probleme beheben kannst, bevor die offizielle Review-Uhr zu laufen beginnt.