Wenn man in FlutterFlow eine App entwickelt, möchte man sicherstellen, das die Benutzer immer eindeutige Usernamen haben. Vor allem, da das Feld display_name
schon fix in der Firebase-User-Collection angelegt ist. Doch wie funktioniert das?
GUI
Zunächst müssen wir dem User das grafische Interface zur Verfügung stellen, damit er den Benutzernamen eingeben kann. Das geht ganz einfach – wir brauchen eigentlich nur 3 Elemente:
Form
: stellt die Validierung sicher;Textfeld
: für die EingabeButton
: zum Speichern
Je nach Anwendungsfall gibt es noch einen zurück oder Abbrechen-Button. Das könnte dann so aussehen:
Validierung & Programmierung
Jetzt geht es schon um die Validierung und Programmierung. Gottseidank nimmt uns FlutterFlow hier einiges an Arbeit ab. Aber zu den einzelnen Elementen:
Form
Hier validieren wir das Eingabefeld; es muss etwas eingegeben werden; wir haben Min- und Max-Längen – und wir können sogar als vorgefertigtes Schema „username
“ (damit sind keine Sonderzeichen möglich) einstellen:
Eingabefeld
Diesem weisen wir als Initial Value einfach den aktuellen Wert von display_name
des aktuell authentifizierten Users zu.
Speichern-Button
So, welche Aktionen passieren, wenn der Button geklickt wird. Kurz zusammengefasst:
- Ist der eingegebene Benutzername der gleiche wir bisher? > dann können wir einfach alles abbrechen und verlassen die Seite.
- Existiert der eingegebene Benutzername bereits?
- Ja: Wir geben eine Meldung als Snackbar aus und warten auf eine neue Eingabe
- Nein: Wir speichern den neuen Namen, geben eine Meldung aus und verlassen die Seite
Wie sieht das Ganze im Action Flow Editor aus?
Der erste Teil so:
Und der zweite Teil so:
Custom Action
Wie ihr seht, gibt es hier aber eine Condition userNameExists
. Dabei handelt es sich um eine Custom Action, der man den neuen Usernamen übergibt und die true
zurückliefert, wenn es diesen bereits gibt und false
, wenn nicht. Doch wie sieht diese aus?
Future<bool> checkIfUsernameExists(String? displayname) async {
// check if email is already in the Users-collection
final QuerySnapshot result = await FirebaseFirestore.instance
.collection('Users')
.where('display_name',
isEqualTo:
displayname)
.get();
final List<DocumentSnapshot> documents = result.docs;
return documents.length > 0;
}
Als Parameter nimmt die Action einen String displayname
entgegen – und sie liefert boolean
zurück.
Disclaimer
Vielleicht ist dies nicht die beste Lösung, aber es funktioniert und vielleicht hilft es ja jemandem, wenn ich das hier poste. Schreibt mir einfach – gerne auch im FlutterFlow-Community-Forum – falls ihr eine bessere Lösung habt 😊😊😊