Mehrere Flows mit combine() verbinden – Live-Validierung ohne Wirrwarr
Wenn ein Ergebnis von mehreren sich ändernden Werten abhängt – z. B. ob ein Formular abgeschickt werden darf – verbindest du die Flows mit combine(). Das reagiert automatisch, sobald sich irgendeiner ändert.
Oft hängt ein Wert von mehreren anderen ab, die sich unabhängig ändern: Der „Anmelden"-Button wird erst aktiv, wenn E-Mail und Passwort gültig sind. Solche Abhängigkeiten von Hand zu verdrahten wird schnell unübersichtlich. Mit combine() verbindest du mehrere Flows zu einem – und der neue Flow gibt automatisch einen neuen Wert aus, sobald sich irgendeiner der Eingaben ändert.
Formular-Validierung im ViewModel
class LoginViewModel : ViewModel() {
val email = MutableStateFlow("")
val password = MutableStateFlow("")
// canSubmit wird bei jeder Änderung von email ODER password neu berechnet
val canSubmit: StateFlow<Boolean> = combine(email, password) { mail, pw ->
mail.contains("@") && pw.length >= 8
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = false,
)
fun onEmailChange(v: String) { email.value = v }
fun onPasswordChange(v: String) { password.value = v }
}Im Compose-UI bindest du das direkt an den Button:
val canSubmit by vm.canSubmit.collectAsStateWithLifecycle()
Button(onClick = vm::submit, enabled = canSubmit) {
Text("Anmelden")
}Warum das so angenehm ist
- Eine Quelle der Wahrheit. Statt in jedem
onChangevon Hand zu prüfen, steckt die Regel an genau einer Stelle. Kommt ein drittes Feld dazu, nimmst du es einfach incombine(email, password, agb)mit auf. - Immer aktuell.
combinewartet, bis jeder Flow mindestens einen Wert hatte, und feuert danach bei jeder Änderung mit den jeweils neuesten Werten aller Quellen. stateInmacht daraus einenStateFlowmit Startwert – ideal fürs UI.WhileSubscribed(5_000)stoppt die Berechnung, wenn für 5 Sekunden niemand mehr zuhört (z. B. App im Hintergrund), und spart so Ressourcen.
Verwandt: Für „nimm immer nur das neueste und verwirf laufende Arbeit" – etwa bei einer Live-Suche – ist flatMapLatest das passende Werkzeug. combine ist für „alle Werte zusammenführen".
Du brauchst eine App mit reaktiven, wartbaren Formularen und Zuständen? Melde dich.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
snapshotFlow in Jetpack Compose – aus Compose-Zustand einen Flow machen
Manchmal willst du auf einen Compose-Zustand reagieren wie auf einen Datenstrom – entprellen, kombinieren, sammeln. Genau das macht snapshotFlow. Ich zeige dir das an der häufigsten Aufgabe: mehr laden, wenn der Nutzer ans Listenende scrollt.
callbackFlow – Listener-APIs in einen Flow verwandeln
Android steckt voller Callback-APIs mit `register`/`unregister`. Mit `callbackFlow` machst du daraus einen ganz normalen Flow – inklusive automatischem Abmelden, wenn niemand mehr zuhört.
kotlinx.serialization: JSON und data class ohne Handarbeit verbinden
Eine API antwortet mit JSON, deine App will eine data class. Dazwischen steht in vielen Projekten ein handgeschriebener Parser. Mit kotlinx.serialization sind es eine Annotation und eine Zeile – und ein Schalter, ohne den deine App beim nächsten API-Update abstürzt.