MWCodebymw.de ↗
Kotlin

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 onChange von Hand zu prüfen, steckt die Regel an genau einer Stelle. Kommt ein drittes Feld dazu, nimmst du es einfach in combine(email, password, agb) mit auf.
  • Immer aktuell. combine wartet, bis jeder Flow mindestens einen Wert hatte, und feuert danach bei jeder Änderung mit den jeweils neuesten Werten aller Quellen.
  • stateIn macht daraus einen StateFlow mit 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

#Kotlin#Coroutines#Flow#StateFlow#ViewModel

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 →