Code, den du sofort einsetzen kannst
Praktische Code-Snippets aus meiner täglichen Arbeit — kopieren, verstehen, einsetzen.
CompositionLocal – Werte durch den Compose-Baum reichen, ohne sie durchzuschleifen
Wenn ein Wert durch acht Composables durchgereicht wird, nur damit ihn das neunte benutzen kann, ist etwas schief. CompositionLocal löst das – aber nur für eine sehr bestimmte Sorte von Werten.
Fehler in Flows abfangen – catch, retry und ein sinnvoller Fallback
Ein try/catch um einen Flow herum fängt nichts. Fehler laufen im Flow selbst mit und werden dort behandelt – mit catch für die Ausgabe und retry für den zweiten Versuch bei Netzproblemen.
WorkManager – Arbeit, die auch läuft, wenn die App zu ist
Daten hochladen, nachts synchronisieren, eine Erinnerung schicken: Sobald etwas laufen soll, während die App geschlossen ist, ist WorkManager das richtige Werkzeug – und nicht ein Thread, den das System sowieso abräumt.
Berechtigungen und Foto-Auswahl in Compose – rememberLauncherForActivityResult
Kamera-Erlaubnis abfragen, ein Bild aus der Galerie holen, ein Dokument öffnen: Dafür gibt es in Compose genau einen Weg, und er ist erfreulich kurz. onActivityResult und startActivityForResult brauchst du nie wieder.
EXISTS statt IN – Unterabfragen, die auch mit NULL richtig rechnen
"Zeig mir alle Kunden, die schon mal bestellt haben" – dafür greifen die meisten zu IN (SELECT …). Das funktioniert, bis eine einzige NULL in der Unterabfrage steht: dann liefert NOT IN plötzlich gar nichts mehr. EXISTS hat dieses Problem nicht.
rememberUpdatedState in Compose – wenn dein Callback im Effekt einfriert
Ein LaunchedEffect mit key1 = Unit startet genau einmal – und hält damit für immer die Lambda-Referenz vom ersten Durchlauf fest. Klickt der Nutzer später etwas anderes an, passiert das Falsche. rememberUpdatedState löst genau das.
Notch und Home-Indikator umschiffen – env(safe-area-inset-*) in CSS
Dein Button klebt am unteren Rand und liegt auf dem iPhone genau unter dem Home-Indikator? Das löst CSS von sich aus – mit env(safe-area-inset-*) und einem Meta-Tag, das fast immer vergessen wird. Ich zeige das Muster, den häufigsten Fehler und wie du den Wert sogar im Canvas nutzt.
Werte einer Gruppe zu einer Liste zusammenfassen – GROUP_CONCAT in SQLite
Du willst pro Zeile nicht nur zählen, sondern die Werte selbst sehen – etwa alle Tags eines Beitrags als „PHP, SQL, Tipp" in einer Spalte? Genau dafür gibt es GROUP_CONCAT. Ich zeige dir die Grundform, ein eigenes Trennzeichen und wie du Dubletten sortiert loswirst.
Sequences in Kotlin – große Datenmengen faul verarbeiten und früh aufhören
Verkettete map/filter bauen bei jedem Schritt eine komplette Zwischenliste. Mit asSequence() läuft die Kette element-für-element – und hört auf, sobald genug Treffer da sind. Wann sich das lohnt und wann nicht.
value class in Kotlin – typsichere IDs ohne Extra-Kosten zur Laufzeit
Ein `String` für die Nutzer-ID, ein `String` für die Bestell-ID – und schon vertauschst du sie irgendwann. Mit `@JvmInline value class` bekommst du echte, unverwechselbare Typen, die zur Laufzeit trotzdem nur der nackte Wert sind. Kein Wrapper-Objekt, keine Bremse.
SSH bequemer machen – ~/.ssh/config und Port-Tunnel
Statt jedes Mal die lange ssh-Zeile zu tippen, hinterlegst du deine Server einmal in ~/.ssh/config. Und mit einem Port-Tunnel erreichst du eine entfernte Datenbank lokal, als liefe sie auf deinem Rechner. Zwei Dinge, die ich täglich nutze.
Suchen & Ersetzen im Terminal mit sed
Einen Text in vielen Dateien austauschen, ohne jede von Hand zu öffnen – das erledigt sed in einer Zeile. Ich zeige dir das Grundmuster, wie du es sicher in mehreren Dateien anwendest und warum du vorher immer erst ohne -i testest.