Jetpack Compose Modifier

Das Mysterium der verketteten Modifier in Jetpack Compose

Jetpack Compose hat in der Android-Welt hohe Wellen geschlagen. Als modernes UI-Toolkit rückt es insbesondere die sogenannten „Modifier“ in den Mittelpunkt der Entwicklung. Doch was passiert, wenn wir mehrere dieser Modifier in einer Sequenz verwenden? Hat die Reihenfolge der Modifier einen Einfluss? Tauche mit adesso mobile in die faszinierende Welt der verketteten Modifier ein und entdecke überraschende Effekte. 

Modifier in Jetpack Compose

Bevor wir ins Detail gehen, müssen wir zunächst eine Frage klären: Was genau sind Modifier in Jetpack Compose? Einfach ausgedrückt, ermöglichen sie es uns, UI-Elemente – auch Composables genannt – nach unseren Vorstellungen zu formen.  

Sie beeinflussen 

  • Größe, Struktur, Verhalten und Erscheinungsbild eines Composables, 
  • ergänzen zusätzliche Angaben, beispielsweise für Barrierefreiheit, 
  • verarbeiten Benutzereingaben und 
  • ermöglichen Interaktionen, wodurch ein Composable anklickbar, scrollbar, dragbar oder zoombar gemacht werden kann.

Betrachten wir ein Beispiel: Wir haben zwei Box Composables, beide mit denselben Modifiern. Sie verwenden zwei Border-Modifier in unterschiedlichen Farbtönen, einen Size-Modifier und einen Padding-Modifier. Eine kleine Änderung in der Reihenfolge dieser Modifier und voilà – das Ergebnis sieht ganz anders aus. Aber warum? 

Das folgende Beispiel illustriert das Phänomen. Bei einer Box stimmt der blaue Rahmen mit einer Referenz-Box von 200.dp überein (untere Box). Bei der anderen Box hingegen ist es der magentafarbene Rahmen.

Jetpack Compose Modifier, Box Compoosables, Code

Das Geheimnis dahinter? Im ersten Szenario wird der Padding-Modifier als Innenabstand interpretiert, während er im zweiten Fall, vor dem Size-Modifier, als Außenabstand angesehen wird. 

Durch solche Feinheiten wird deutlich, wie wichtig das Verständnis und die richtige Anwendung von Modifiern in Jetpack Compose sind.

Draw-Modifier

Ein besonders interessantes Phänomen tritt auf, wenn ein Scale- und ein Oset-Modifier in Kombination verwendet werden. Und, wie es sich für solch ein Rätsel gehört, spielt die Reihenfolge eine entscheidende Rolle. Nehmen wir als Beispiel zwei Box Composables, die sich durch ihre Farben – Magenta und Blau – unterscheiden: 

Code Snippet für die Magenta Box:

Jetpack Compose Modifier, Code Snippet, Magenta Box

Code Snippet für die Blaue Box:

Jetpack Compose-Modifier, Code Snippet, Blaue Box

Bei einem Vergleich der blauen mit der magentafarbenen Box sticht ins Auge, dass sich lediglich die Anordnung von Scale- und Offset-Modifier unterscheidet. Welche Auswirkung hat dies konkret? Bei der magentafarbenen Box bleibt der Offset unverändert, da der Scale-Modifier anschließend angewendet wird. Anders bei der blauen Box: Hier beeinflusst der vorausgehende Scale-Modifier den Offset, was dazu führt, dass sie sich weiter rechts positioniert. Dies liegt daran, dass der Offset durch die Skalierung intensiviert wird – er wird verdoppelt.

Chaining Custom-Modifiers

Betrachten wir nun ein weiteres Beispiel: Wie verändert sich das Verhalten, wenn wir die Platzierung eines individuell erstellten Modifiers anpassen?

Werfen wir zunächst einen Blick auf die Umsetzung eines solchen Custom-Modifiers, der einen vertikalen Gradienten darstellt:

Wenn wir unseren maßgeschneiderten Modifier auf ein Image Composable anwenden und dieses mit einem Clip-Modifier verbinden, um eine runde Formgebung zu erhalten, wird einmal mehr deutlich: Die Abfolge der Modifier ist von zentraler Bedeutung.

Jetpack Compose Modifier, Vertikale Gradienten
Jetpack Compose Modifier, Changing Modifiers, Clip-Modifier, Code

Interessanterweise nimmt der Clip-Modifier nur auf nachfolgende Modifier Einfluss, jedoch nicht auf diejenigen, die in der Sequenz vor ihm stehen. Daher sollten wir in unserem Szenario zuerst den Clip-Modifier einsetzen, gefolgt von unserem Custom-Modifier, um das angestrebte kreisförmige Design zu realisieren.

Mehrere Size-Modifier

Manchmal übergeben wir Modifier von einem Composable zum nächsten, und es kann passieren, dass wir den Überblick darüber verlieren, welche Modifier bereits implementiert wurden. Beispiel: Beginnen wir mit einem fillMaxSize-Modifier und fügen dann einen weiteren Size-Modifier bei einem Image Composable hinzu. Was wird dadurch dargestellt? Ein Bild in maximaler Größe oder vielleicht in einer Größe von 5.dp?

Jetpack Compose Modifier, fillMaxSize-Modifier

In solchen Szenarien wird der zweite Size-Modifier ignoriert und nur der fillMaxSize-Modifier kommt zur Anwendung.

Ein weiteres Szenario: Was, wenn ein .wrapContentSize-Modifier auf einen fillMaxSize-Modifier folgt? Anders als im vorherigen Beispiel wird hier der zweite Size-Modifier nicht gänzlich ignoriert. Stattdessen nimmt die Layout-Node die Dimensionen des fillMaxSize-Modifiers ein, aber innerhalb dieser Größe wird das Bild mit .wrapContentSize in entsprechender Größe zentralisiert. Ohne den .wrapContentSize-Modifier wäre das Bild nicht zentriert. Das kann bei der Interaktion mit dem Bild zu Verwirrung führen, da es den Anschein hat, als würde sich die Größe nach .wrapContentSize richten, obwohl der tatsächliche Touch-Bereich viel größer ist, da der fillMaxSize-Modifier immer noch ausschlaggebend ist.

Jetpack Compose Modifier, wrapContentSize

Außerhalb festgelegter Grenzen

Wie verhalten sich Size-Modifier, die außerhalb festgelegter Grenzen liegen. Angenommen, es gibt eingehende Constraints (Layout-Beschränkungen), die die Größe unserer Layout-Node bereits limitieren. Bei Auswahl eines zu großen oder zu kleinen Size-Modifiers könnten unerwünschte Resultate auftreten. Ist der gewählte Modifier-Wert etwa zu groß, passt sich die Layout-Node an die maximalen Constraints an. Wird hingegen ein zu kleiner Modifier-Wert gewählt, gelten die minimalen Constraints.

Jetpack Compose Modifier, Layout Node

In der Praxis wird eine Layout-Node stets versuchen, die Size-Modifier so präzise wie möglich umzusetzen, wobei sie immer die vorgegebenen Layout-Grenzen berücksichtigt. Dabei formen die Modifier die Constraints für eine Layout-Node, und diese Constraints wiederum bestimmen deren Größe.

Fazit – Order matters

Die Reihenfolge, in der Modifier in Jetpack Compose verkettet werden, ist nicht bloß eine Formalität – sie kann ein Composable maßgeblich verändern. Dabei kann sie nicht nur die Größe und Gestalt, sondern auch funktionelle Aspekte, wie Touch-Bereiche, erheblich beeinflussen.

Während es in den meisten Fällen recht intuitiv ist, Modifier eines Composables sequenziell zu interpretieren, gibt es Fälle, in denen diese Reihenfolge zu unerwarteten Ergebnissen führen kann. Insbesondere Size-Modifier können ihre Wirksamkeit verlieren, wenn sie mehrfach innerhalb einer Kette angewendet werden.

Mehr zum Thema

×
Telefon

Sie sind auf der Suche nach einem Experten im Bereich App-Entwicklung? Wir freuen uns auf Ihre Nachricht!

+49 231 99953850
×