Firebase-Interviewfragen 2026: Flutter Auth, Firestore und Security Rules

Firebase-Interviewfragen für Flutter-Entwickler mit Dart-Antworten: Auth-State-Streams, Google Sign-In v7, Firestore CRUD und Datenmodellierung, Security Rules, Custom Claims, Transaktionen und die Änderungen in FlutterFire 5.

Flutter Firebase Authentication Firestore 2026

Firebase-Interviewfragen für Flutter-Stellen drehen sich um fünf Themen: die drei Auth-State-Streams, die Datenmodellierung in Firestore, Security Rules, Offline-Writes und das Kostenmodell hinter jedem Lesezugriff. Firebase bleibt 2026 das Standard-Backend für Flutter-Apps, und seit Oktober 2026 erscheinen die FlutterFire-Plugins als BoM 5.x (firebase_core 5.1.0, firebase_auth 7.0.1, cloud_firestore 7.1.0), mit einem auf 24 angehobenen Android-minSdk und dem Firebase Apple SDK 13 als Unterbau.

FlutterFire BoM 5.1.0 (Oktober 2026)

Das aktuelle FlutterFire-Release ist BoM 5.1.0: firebase_auth 7.0.1, cloud_firestore 7.1.0, firebase_core 5.1.0. Die Major-Version 5.0.0 verlangt Android-minSdk 24, baut auf dem Firebase Apple SDK 13.0.0 auf und benennt die activate-Parameter von App Check um. Firestore Pipelines, eingeführt in cloud_firestore 6.3.0, erhalten mit jedem Release weitere Ausdrücke.

Firebase-Interviewfragen: Was 2026 abgefragt wird

Interviewer fragen selten API-Details ab. Sie prüfen, ob ein Kandidat versteht, wo Firebase Regeln durchsetzt, was jede Operation kostet und was passiert, wenn das Netz wegbricht. Die Tabelle ordnet jedem wiederkehrenden Thema zu, was eine starke Antwort enthalten muss. Jedes Thema wird im Abschnitt Firebase-Interviewfragen für Flutter-Entwickler weiter unten ausführlich beantwortet.

ThemaTypische FrageWas eine starke Antwort enthält
Auth-StreamsauthStateChanges() vs idTokenChanges() vs userChanges()Welche Events jeder Stream liefert und welcher die Navigation absichert
SicherheitWo wird die Zugriffskontrolle durchgesetzt?Security Rules auf dem Server, nie Prüfungen im Client; App Check ist eine andere Schicht
RollenWie wird eine Admin-Rolle umgesetzt?Custom Claims, gesetzt über das Admin SDK, gelesen über request.auth.token
DatenmodellierungEine Chat-App modellierenSubcollections, denormalisierte letzte Nachricht, ein Dokument pro Nachricht
KonsistenzTransaktion oder Batched Write?Transaktionen lesen, schreiben dann und werden wiederholt; Batches schreiben nur, dafür atomar
OfflineWas passiert mit einem Write ohne Netz?Lokaler Cache, hasPendingWrites, Synchronisierung beim Reconnect
KostenWarum ist dieser Screen teuer?Abrechnung pro gelesenem Dokument, Listener, Pagination mit Cursors
VergleichFirestore vs Realtime DatabaseAbfragemodell, Skalierung, Abrechnungseinheit

Firebase-Projekt Setup und Initialisierung

Die Einrichtung von Firebase in einer Flutter-App beginnt mit der Installation des FlutterFire CLI. Dieses Tool generiert automatisch die plattformspezifischen Konfigurationsdateien (firebase_options.dart), die früher manuell erstellt werden mussten.

Nach der Installation der Pakete firebase_core, firebase_auth und cloud_firestore erfolgt die Initialisierung in der main.dart-Datei:

main.dartdart
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'firebase_options.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // Initialize Firebase with platform-specific config
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(const MyApp());
}

Die ensureInitialized()-Methode stellt sicher, dass das Flutter-Framework bereit ist, bevor asynchrone Operationen ausgeführt werden. Der Parameter DefaultFirebaseOptions.currentPlatform wählt automatisch die korrekte Konfiguration basierend auf der Zielplattform (iOS, Android, Web).

FlutterFire CLI

Das FlutterFire CLI (flutterfire configure) automatisiert die Projekt-Konfiguration und generiert die benötigte firebase_options.dart-Datei. Entwickler müssen nicht mehr manuell die Google-Services-Dateien herunterladen oder platzieren.

Firebase Authentication: Email/Password und Google Sign-In

Die Authentifizierung bildet die Grundlage jeder sicheren App. Firebase Authentication bietet verschiedene Provider, wobei Email/Password und Google Sign-In zu den am häufigsten genutzten gehören. Dazu kommen SMS-Verifizierung per Telefonnummer und Multi-Faktor-Authentifizierung, seit firebase_auth 6.1.0 auch mit TOTP unter macOS.

Email/Password Authentifizierung

Ein strukturierter AuthService kapselt die Authentifizierungslogik und behandelt Fehlerszenarien explizit:

auth_service.dartdart
import 'package:firebase_auth/firebase_auth.dart';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  // Register with email and password
  Future<User?> register(String email, String password) async {
    try {
      final credential = await _auth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      return credential.user;
    } on FirebaseAuthException catch (e) {
      // Handle specific error codes
      switch (e.code) {
        case 'email-already-in-use':
          throw Exception('This email is already registered');
        case 'weak-password':
          throw Exception('Password must be at least 6 characters');
        default:
          throw Exception('Registration failed: ${e.message}');
      }
    }
  }

  // Sign in with existing credentials
  Future<User?> signIn(String email, String password) async {
    final credential = await _auth.signInWithEmailAndPassword(
      email: email,
      password: password,
    );
    return credential.user;
  }

  // Reactive auth state stream
  Stream<User?> get authStateChanges => _auth.authStateChanges();
}

Die authStateChanges()-Stream-Methode ist besonders wichtig: Sie gibt einen kontinuierlichen Stream aus, der über Änderungen des Authentifizierungsstatus informiert. Widgets können diesen Stream nutzen, um automatisch zwischen Login- und Dashboard-Ansichten zu wechseln.

Passwortregeln müssen nicht mehr nur im Client liegen: Die API validatePassword (seit firebase_auth 6.0.0) prüft ein Passwort gegen die in der Firebase Console konfigurierte Richtlinie, die eine Mindestlänge, Groß- und Kleinbuchstaben, Ziffern und Sonderzeichen verlangen kann.

Google Sign-In Integration

Google Sign-In erfordert das zusätzliche Paket google_sign_in. Seit google_sign_in 7.0 ist das Plugin ein Singleton, das über GoogleSignIn.instance bezogen und genau einmal initialisiert wird, und die Authentifizierung ist von der Autorisierung getrennt. Der Aufruf GoogleSignIn().signIn() aus älteren Tutorials kompiliert nicht mehr.

google_auth.dartdart
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

// Call once at startup, before any other GoogleSignIn method
Future<void> initGoogleSignIn() => GoogleSignIn.instance.initialize();

Future<UserCredential> signInWithGoogle() async {
  try {
    // Shows the native account picker; throws if the user cancels
    final googleUser = await GoogleSignIn.instance.authenticate();

    // Synchronous getter since v7: only the ID token is exposed here
    final googleAuth = googleUser.authentication;

    // Firebase only needs the ID token to create the credential
    final credential = GoogleAuthProvider.credential(
      idToken: googleAuth.idToken,
    );
    return FirebaseAuth.instance.signInWithCredential(credential);
  } on GoogleSignInException catch (e) {
    if (e.code == GoogleSignInExceptionCode.canceled) {
      throw Exception('Sign-in cancelled');
    }
    rethrow;
  }
}

Dieses Muster gilt für alle OAuth-Provider: Provider-Token holen, in ein Firebase-Credential verpacken, dann signInWithCredential aufrufen. Braucht die App zusätzlich eine Google-API (Drive, Calendar), stammt das Access Token jetzt aus einem eigenen Schritt, authorizationClient.authorizeScopes, wie im Migrationsleitfaden von google_sign_in beschrieben.

Interview-Falle: Google Sign-In v7

Wer GoogleSignIn().signIn() schreibt und accessToken aus authentication liest, zitiert die API vor 7.0. In v7 liefert authenticate() den Account, authentication enthält nur noch das idToken, und Access Tokens für zusätzliche Scopes erfordern einen expliziten Autorisierungsaufruf.

Platform-spezifische Konfiguration

Google Sign-In benötigt zusätzliche Konfiguration in den iOS- und Android-Projekten. Für iOS muss die GoogleService-Info.plist mit der korrekten OAuth-Client-ID konfiguriert werden. Auf Android ist die SHA-1-Fingerprint-Registrierung in der Firebase Console erforderlich.

Firestore CRUD-Operationen und Datenmodellierung

Cloud Firestore ist eine NoSQL-Dokumentendatenbank, die Echtzeitdaten-Synchronisation bietet. Die grundlegenden CRUD-Operationen (Create, Read, Update, Delete) bilden das Fundament jeder Firestore-Integration.

Ein TaskService demonstriert typische Firestore-Operationen:

firestore_service.dartdart
import 'package:cloud_firestore/cloud_firestore.dart';

class TaskService {
  final _db = FirebaseFirestore.instance;
  final String _collection = 'tasks';

  // Create a new document with auto-generated ID
  Future<String> createTask(String userId, String title) async {
    final doc = await _db.collection(_collection).add({
      'userId': userId,
      'title': title,
      'completed': false,
      'createdAt': FieldValue.serverTimestamp(),
    });
    return doc.id;
  }

  // Read a single document by ID
  Future<Map<String, dynamic>?> getTask(String taskId) async {
    final snapshot = await _db.collection(_collection).doc(taskId).get();
    return snapshot.data();
  }

  // Update specific fields without overwriting the entire document
  Future<void> toggleComplete(String taskId, bool completed) async {
    await _db.collection(_collection).doc(taskId).update({
      'completed': completed,
      'updatedAt': FieldValue.serverTimestamp(),
    });
  }

  // Delete a document
  Future<void> deleteTask(String taskId) async {
    await _db.collection(_collection).doc(taskId).delete();
  }
}

Wichtige Details:

  • FieldValue.serverTimestamp() verwendet die Firebase-Serverzeit, nicht die lokale Gerätezeit. Dies verhindert Inkonsistenzen bei Geräten mit falschen Zeiteinstellungen.
  • Die add()-Methode generiert automatisch eine eindeutige Dokument-ID. Alternativ kann doc('custom-id').set() für benutzerdefinierte IDs verwendet werden.
  • update() modifiziert nur die angegebenen Felder, während set() das gesamte Dokument überschreibt (es sei denn, SetOptions(merge: true) wird verwendet).
  • Seit cloud_firestore 7.1.0 ergänzen FieldValue.minimum und FieldValue.maximum die serverseitigen Transformationen: Sie behalten ohne vorherigen Lesezugriff den kleineren bzw. größeren Wert aus gespeichertem und eingehendem Wert, was zu Zählern wie einem Highscore passt.

Bereit für deine Flutter-Interviews?

Übe mit unseren interaktiven Simulatoren, Flashcards und technischen Tests.

Real-Time Streams und Reaktive UI-Updates

Die wahre Stärke von Firestore liegt in der Echtzeitdaten-Synchronisation. Mit Streams können Widgets automatisch auf Datenbankänderungen reagieren, ohne manuelles Polling.

real_time_tasks.dartdart
import 'package:cloud_firestore/cloud_firestore.dart';

class TaskStream {
  final _db = FirebaseFirestore.instance;

  // Stream all tasks for a specific user, ordered by creation date
  Stream<List<Map<String, dynamic>>> userTasks(String userId) {
    return _db
        .collection('tasks')
        .where('userId', isEqualTo: userId)
        .orderBy('createdAt', descending: true)
        .snapshots()
        .map((snapshot) => snapshot.docs.map((doc) {
              final data = doc.data();
              data['id'] = doc.id; // Include document ID
              return data;
            }).toList());
  }
}

Dieser Stream gibt kontinuierlich aktualisierte Task-Listen zurück. Jede Änderung in der Firestore-Collection löst ein neues Event aus. Die Kombination von where() und orderBy() erfordert einen zusammengesetzten Index, den Firebase automatisch vorschlägt, wenn er fehlt.

In einem Widget wird der Stream mit StreamBuilder konsumiert:

offline_aware_widget.dartdart
StreamBuilder<DocumentSnapshot>(
  stream: FirebaseFirestore.instance
      .collection('tasks')
      .doc(taskId)
      .snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return const CircularProgressIndicator();

    final data = snapshot.data!;
    final isPending = data.metadata.hasPendingWrites;

    return Row(
      children: [
        Text(data['title']),
        if (isPending) const Icon(Icons.cloud_upload, size: 16),
      ],
    );
  },
)

Die hasPendingWrites-Property zeigt an, ob lokale Änderungen noch nicht mit dem Server synchronisiert wurden. Dies ermöglicht die Implementierung von Offline-Indikatoren in der UI.

Offline-Persistenz

Firestore aktiviert standardmäßig lokale Persistenz auf mobilen Plattformen. Änderungen werden lokal gespeichert und automatisch synchronisiert, sobald die Netzwerkverbindung wiederhergestellt ist. Im Web wird die Persistenz über Settings(persistenceEnabled: true) aktiviert, die frühere Methode enablePersistence() ist veraltet.

Firestore Security Rules: Server-seitige Validierung

Security Rules sind die zentrale Sicherheitsschicht von Firestore. Sie definieren, wer auf welche Daten zugreifen darf und welche Validierungsregeln gelten.

firestore.rulesjavascript
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Users can only access their own profile
    match /users/{userId} {
      allow read, update: if request.auth != null
                          && request.auth.uid == userId;
      allow create: if request.auth != null;
      allow delete: if false; // Prevent self-deletion
    }

    // Tasks belong to the user who created them
    match /tasks/{taskId} {
      allow read, write: if request.auth != null
                         && resource.data.userId == request.auth.uid;
      allow create: if request.auth != null
                    && request.resource.data.userId == request.auth.uid;
    }
  }
}

Wichtige Konzepte:

  • request.auth.uid enthält die User-ID des authentifizierten Nutzers
  • resource.data referenziert das existierende Dokument
  • request.resource.data referenziert das neue/modifizierte Dokument
  • Die Trennung von read/write in get, list, create, update, delete ermöglicht granulare Kontrolle
Security Rules Testing

Firebase bietet einen Rules Playground in der Console, um Regeln zu testen, bevor sie deployed werden. Zusätzlich kann das Firebase Emulator Suite lokal verwendet werden, um Sicherheitsregeln während der Entwicklung zu validieren.

Repository Pattern und Testbarkeit

Für wartbare und testbare Codebases empfiehlt sich das Repository Pattern. Es entkoppelt die Datenquelle von der Business-Logik und ermöglicht das Austauschen von Firebase gegen Mock-Implementierungen in Unit-Tests.

task_repository.dartdart
abstract class TaskRepository {
  Future<String> create(String userId, String title);
  Stream<List<Task>> watchAll(String userId);
  Future<void> update(String id, Map<String, dynamic> fields);
  Future<void> delete(String id);
}

// firebase_task_repository.dart
class FirebaseTaskRepository implements TaskRepository {
  final _db = FirebaseFirestore.instance;

  
  Future<String> create(String userId, String title) async {
    final doc = await _db.collection('tasks').add({
      'userId': userId,
      'title': title,
      'completed': false,
      'createdAt': FieldValue.serverTimestamp(),
    });
    return doc.id;
  }

  
  Stream<List<Task>> watchAll(String userId) {
    return _db
        .collection('tasks')
        .where('userId', isEqualTo: userId)
        .orderBy('createdAt', descending: true)
        .snapshots()
        .map((s) => s.docs.map(Task.fromFirestore).toList());
  }

  // ... update and delete implementations
}

Diese Architektur erlaubt Dependency Injection und vereinfacht das Testen erheblich. Eine Mock-Implementierung kann in-memory-Daten verwenden, ohne Firebase-Abhängigkeiten. State-Management-Lösungen wie Riverpod oder BLoC konsumieren nur das Repository-Interface und kennen Firestore nicht.

Upgrade auf FlutterFire 5: Was bricht

Das Major-Release vom Oktober 2026 (BoM 5.0.0, firebase_auth 7.0.0, cloud_firestore 7.0.0, firebase_core 5.0.0) ändert vor allem die Build-Anforderungen, weniger die Dart-APIs. An diesen Punkten scheitert ein Build oder ein Review:

  • Android-minSdk 24: Die Plugins bauen auf der Firebase Android BoM 35 auf. Ein Projekt, das noch auf minSdk 21 oder 23 steht, kompiliert nicht mehr.
  • Apple SDK 13: Das Firebase Apple SDK wechselt mit Swift Package Manager auf 13.0.0 (mit CocoaPods auf 12.19.0), und Swift Packages setzen macOS 11 voraus.
  • App Check: Die activate-Parameter heißen jetzt providerWeb, providerAndroid und providerApple.
  • Deprecations: setIndexConfigurationFromJSON ist in cloud_firestore 7.0.0 als veraltet markiert, und firebase_ml_model_downloader wird nicht mehr veröffentlicht.
  • Bereits in der 6.x-Reihe entfernt: fetchSignInMethodsForEmail() und User.updateEmail(). Code, der vor der Anmeldung prüft, welchen Provider eine E-Mail-Adresse nutzt, muss neu konzipiert werden, weil der Schutz vor E-Mail-Enumeration diese Information verbirgt.

Die vollständige Liste pro Paket steht in den FlutterFire-Release-Notes und im Changelog von cloud_firestore.

Firebase-Interviewfragen für Flutter-Entwickler

Interviews prüfen sowohl das konzeptionelle Verständnis als auch die praktische Umsetzung der Firebase-Dienste. Die folgenden Fragen tauchen 2026 regelmäßig in Flutter-Interviews auf. Der Leitfaden zu Flutter-Interviewfragen deckt die Framework-Seite ab.

1. Worin unterscheidet sich authStateChanges() von idTokenChanges() und userChanges()?

authStateChanges() feuert nur bei An- und Abmeldung. idTokenChanges() feuert zusätzlich, wenn das ID-Token erneuert wird (etwa einmal pro Stunde). userChanges() erfasst all das und dazu Profiländerungen wie updateDisplayName(). Für die meisten Navigation Guards reicht authStateChanges().

2. Was ist der Unterschied zwischen set() und update() in Firestore?

set() überschreibt das gesamte Dokument (außer mit SetOptions(merge: true)), während update() nur die angegebenen Felder modifiziert. update() schlägt fehl, wenn das Dokument nicht existiert, während set() es erstellt.

3. Wie funktioniert die Offline-Persistenz in Firestore?

Firestore speichert Daten lokal auf dem Gerät und synchronisiert sie automatisch, wenn eine Netzwerkverbindung verfügbar ist. Änderungen werden in einer lokalen Warteschlange gespeichert. Die hasPendingWrites-Eigenschaft zeigt an, ob Daten noch nicht synchronisiert wurden.

4. Wie sollten Firestore-Daten für eine Chat-Anwendung modelliert werden?

Eine Collection chats, deren Dokumente die Metadaten enthalten (Teilnehmer, Zeitstempel der letzten Nachricht), und darunter pro Chat-Dokument eine Subcollection messages. So lässt sich die Chat-Liste eines Nutzers effizient abfragen, während die Nachrichten jeder Unterhaltung paginiert werden. Die letzte Nachricht wird ins übergeordnete Dokument denormalisiert, damit die Listenansicht die Subcollection nicht lesen muss.

5. Warum sollte man FieldValue.serverTimestamp() statt DateTime.now() verwenden?

Die Serverzeit ist konsistent über alle Clients hinweg, unabhängig von lokalen Zeitzoneneinstellungen oder Geräteuhren. Dies verhindert Probleme mit falsch eingestellten Gerätezeiten und sorgt für korrekte Sortierung und Zeitstempel.

6. Was sind zusammengesetzte Indizes und wann werden sie benötigt?

Zusammengesetzte Indizes werden für Abfragen benötigt, die mehrere Felder filtern oder sortieren. Firebase schlägt automatisch fehlende Indizes vor, wenn eine Abfrage fehlschlägt. Diese müssen in der Firebase Console oder via firestore.indexes.json erstellt werden.

7. Wann ist eine Transaktion statt eines Batched Writes nötig?

Eine Transaktion ist nötig, wenn der Write von Daten abhängt, die in derselben Operation gelesen werden, etwa beim Verringern des Lagerbestands nur dann, wenn er über null liegt. Das SDK wiederholt den Callback, wenn sich ein gelesenes Dokument vor dem Commit ändert, deshalb darf der Callback keine Seiteneffekte haben. Ein Batched Write führt mehrere Writes atomar aus, ganz ohne Lesezugriff, zum Beispiel das Anlegen eines Dokuments und das Hochzählen eines Zählers an anderer Stelle. Offline verhalten sich beide unterschiedlich: Ein Batch wird in die Warteschlange gestellt, eine Transaktion scheitert ohne Verbindung.

dart
final db = FirebaseFirestore.instance;

// Transaction: read then write, retried on contention
await db.runTransaction((tx) async {
  final ref = db.collection('products').doc(id);
  final snap = await tx.get(ref);
  final stock = snap.get('stock') as int;
  if (stock <= 0) throw Exception('Out of stock');
  tx.update(ref, {'stock': stock - 1});
});

// Batched write: atomic writes, no reads
final batch = db.batch();
batch.set(db.collection('orders').doc(), {'productId': id});
batch.update(db.collection('stats').doc('orders'), {
  'count': FieldValue.increment(1),
});
await batch.commit();

8. Wie wird eine Admin-Rolle mit Firebase umgesetzt?

Mit Custom Claims, die aus einer vertrauenswürdigen Umgebung über das Admin SDK gesetzt werden, niemals aus dem Flutter-Client. Der Claim reist im ID-Token mit, daher lesen die Regeln ihn als request.auth.token.admin == true, ohne zusätzlichen Dokumentzugriff. Die Dokumentation zu Custom Claims begrenzt die Nutzlast auf 1000 Bytes, und der Client sieht einen neuen Claim erst nach einer Token-Erneuerung, die currentUser.getIdToken(true) erzwingt.

9. Wie verhindert man unautorisierten Zugriff auf Firestore-Daten?

Durch Security Rules, die server-seitig validieren, ob ein Nutzer auf bestimmte Dokumente zugreifen darf. Regeln sollten immer request.auth überprüfen und Benutzer-IDs mit Dokument-Daten abgleichen. Niemals nur auf Client-Validierung verlassen.

10. Was unterscheidet Security Rules von App Check?

Security Rules entscheiden, ob ein bestimmter Nutzer ein bestimmtes Dokument lesen oder schreiben darf. App Check bestätigt, dass die Anfrage von der echten App auf einem echten Gerät stammt, und blockiert damit Skripte, die den öffentlichen API-Key wiederverwenden. Beide beantworten unterschiedliche Fragen, eine Produktions-App braucht also beides. Seit FlutterFire 5 wird App Check mit providerAndroid, providerApple und providerWeb aktiviert.

11. Warum kann ein Firestore-Screen teuer werden, und wie funktioniert Pagination?

Firestore rechnet pro gelesenem, geschriebenem und gelöschtem Dokument ab. Ein Listener auf eine unbegrenzte Collection liest beim ersten Laden jedes passende Dokument, danach einen Lesezugriff pro geändertem Dokument. Pagination nutzt Query-Cursors statt Offsets: limit(20) für die erste Seite, dann startAfterDocument(lastDoc) für die nächste, sodass jede Seite nur die Dokumente kostet, die sie zurückgibt.

12. Firestore oder Realtime Database: welche und warum?

Firestore speichert Dokumente in Collections, unterstützt zusammengesetzte Abfragen mit Indizes und rechnet pro Operation ab. Die Realtime Database speichert einen einzigen JSON-Baum, bietet flache Abfragen auf einem Child-Key und rechnet hauptsächlich nach Bandbreite und Speicher ab, was zu kleinen, sehr häufigen Updates wie Präsenzanzeigen passt. Die meisten neuen Flutter-Apps starten mit Firestore und ergänzen die Realtime Database nur für Präsenz.

13. Was ist der Vorteil von Streams gegenüber Futures in Firebase?

Streams liefern kontinuierliche Updates bei Datenänderungen, während Futures nur einmalige Werte zurückgeben. Für Echtzeitdaten ist snapshots() effizienter als wiederholtes Polling mit get().

14. Wie testet man Firebase-abhängigen Code?

Durch das Repository Pattern können Mock-Implementierungen in Tests injiziert werden. Alternativ bietet Firebase die Emulator Suite für lokale Integration-Tests mit echten Firebase-Services ohne Cloud-Kosten.

Für die weitere Vorbereitung auf Flutter-Interviews decken eigene Übungsmodule diese Themen mit interaktiven Quizzen und Challenges auf Zeit ab.

Fang an zu üben!

Teste dein Wissen mit unseren Interview-Simulatoren und technischen Tests.

Quellen

Flutter und Firebase im Interview: die wichtigsten Punkte

  • FlutterFire BoM 5.1.0 liefert firebase_auth 7.0.1 und cloud_firestore 7.1.0 und verlangt Android-minSdk 24
  • google_sign_in 7 ersetzt GoogleSignIn().signIn() durch GoogleSignIn.instance.initialize() und anschließend authenticate(), Firebase braucht nur das idToken
  • authStateChanges() liefert einen reaktiven Stream, der den Login-Status in der ganzen App ohne manuelle Prüfungen abbildet
  • Echtzeit-Synchronisierung über snapshots() ersetzt Polling und greift direkt in StreamBuilder für automatische UI-Updates
  • Security Rules sind in Produktion Pflicht: request.auth.uid immer gegen die Besitzerfelder des Dokuments prüfen, Rollen über Custom Claims abbilden
  • Transaktionen lesen und schreiben dann mit Wiederholungen, Batched Writes schreiben nur; Pagination läuft über Cursors, weil jedes gelesene Dokument abgerechnet wird
  • Offline-Persistenz funktioniert auf Mobilgeräten ohne zusätzlichen Code, hasPendingWrites zeigt Nutzern den Synchronisierungsstatus an
  • Das Repository Pattern entkoppelt Firebase von der Business-Logik und vereinfacht Tests und spätere Migrationen
Tägliche Challenge

Findest du den Bug in Flutter?

Ein echter Codeausschnitt, ein versteckter Bug, ein Versuch pro Tag. Zum Ausprobieren ohne Konto.

Anthony Fillion-Maillet

Geschrieben von

Anthony Fillion-Maillet

Gründer von SharpSkill

Seit über 10 Jahren Fullstack-Entwickler. Er leitet SharpSkill und verantwortet alles, was hier erscheint.

Aktualisiert am 9. November 2026

Tags

#flutter
#firebase
#authentication
#firestore
#dart

Teilen

Verwandte Artikel