CommunityCodierung & Entwicklunggithub.com

wasey-rao/kmp-edge-to-edge

Edge-to-edge-Layout in Compose Multiplatform für Android und iOS – plattformspezifische Aktivierung, WindowInsets mit Scaffold, Listen, untere Leisten, Tastaturen (IME), Display-Ausschnitte, Kontrast der Systemleistensymbole und Werbebanner an den Bildschirmrändern. Verwenden Sie dies beim Erstellen eines beliebigen Bildschirm-Scaffolds, beim Beheben von Inhalten, die hinter der Statusleiste, Navigationsleiste, Notch oder Tastatur versteckt sind, oder wenn Sie Android 15 und höher anvisieren.

Was ist kmp-edge-to-edge?

Diese Fähigkeit (Skill) `wasey-rao/kmp-edge-to-edge` bietet eine umfassende Anleitung und Implementierung für Edge-to-Edge-Layouts in Compose Multiplatform, die sowohl Android als auch iOS abdecken. Sie ist besonders nützlich, da Android ab SDK 35 Edge-to-Edge erzwingt und die Opt-out-Möglichkeit ab SDK 36 entfällt. Der Skill erklärt, wie man Edge-to-Edge plattformspezifisch aktiviert (mit `enableEdgeToEdge()` in Android und `ignoresSafeArea()` in SwiftUI für iOS), und wie man `Scaffold` sowie `WindowInsets` (wie `safeDrawing`, `ime`) richtig verwendet, um Inhalte hinter Statusleisten, Notches, Navigationsleisten und Tastaturen zu vermeiden. Er enthält auch spezifische Anleitungen für Tastaturen (IME), Vollbildinhalte (Bilder, Karten), Kontrast der Systemleistensymbole und Werbebanner, sowie eine Checkliste für jeden Bildschirm, um sicherzustellen, dass Inhalte korrekt dargestellt werden und keine doppelten Insets angewendet werden. Der Skill unterstützt Compose Multiplatform und richtet sich an Entwickler, die plattformübergreifende Apps mit einheitlichem Edge-to-Edge-Verhalten erstellen möchten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wasey-rao/kmp-agent-studio/tree/HEAD/kmp-studio/skills/kmp-edge-to-edge

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Edge-to-Edge in Compose Multiplatform

Android erzwingt Edge-to-Edge für Apps, die auf SDK 35 und höher abzielen, und die Opt-out-Möglichkeit entfällt ab SDK 36. iOS-Apps werden erwartet, unter der Statusleiste und dem Home-Indikator zu zeichnen. Bauen Sie jeden Bildschirm von Anfang an Edge-to-Edge.

Die Regel: Hintergründe zeichnen hinter den Systemleisten; Inhalte und Steuerelemente werden durch Insets gepolstert.

Aktivieren

Android (MainActivity in androidApp), vor setContent:

override fun onCreate(savedInstanceState: Bundle?) {
    enableEdgeToEdge()
    super.onCreate(savedInstanceState)
    setContent { App() }
}

Setzen Sie im Manifest android:windowSoftInputMode="adjustResize" für die Aktivität, damit IME-Insets Compose erreichen.

iOS (ContentView.swift): Lassen Sie Compose den gesamten Bildschirm besitzen, andernfalls wendet SwiftUI zuerst die sicheren Bereiche an und Compose sieht keine Insets.

ComposeView().ignoresSafeArea()

Scaffold erledigt den Großteil der Arbeit

Scaffold(
    topBar = { TopAppBar(title = { Text(title) }) },          // polstert sich selbst für die Statusleiste
    bottomBar = { NavigationBar { /* ... */ } },              // polstert sich selbst für die Navigationsleiste
) { innerPadding ->
    LazyColumn(
        contentPadding = innerPadding,                         // Inhalt scrollt unter den Leisten
        modifier = Modifier.fillMaxSize(),
    ) { /* items */ }
}
  • Verwenden Sie immer innerPadding. Übergeben Sie es bei Listen als contentPadding, damit Elemente hinter transparenten Leisten scrollen; für nicht scrollbare Inhalte verwenden Sie Modifier.padding(innerPadding).
  • Material 3-Leisten verbrauchen ihre eigenen Insets. Fügen Sie keine statusBarsPadding() zusätzlich zu einer TopAppBar hinzu.
  • Verschachtelte Scaffolds verdoppeln das Padding. Geben Sie dem inneren Scaffold contentWindowInsets = WindowInsets(0) oder wenden Sie consumeWindowInsets(innerPadding) auf den äußeren Inhalt an.

Bildschirme ohne Scaffold

Box(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) {   // Hintergrund füllt den Bildschirm
    Column(Modifier.fillMaxSize().windowInsetsPadding(WindowInsets.safeDrawing)) { /* content */ }
}

WindowInsets.safeDrawing deckt Statusleiste, Navigationsleiste, Display-Ausschnitt und Tastatur ab. Verwenden Sie safeContent, wenn Gesten wichtig sind. Wenden Sie Inset-Padding einmal an, auf der Ebene, die den Inhalt besitzt, niemals sowohl auf Eltern- als auch auf Kind-Element.

Tastatur

  • Eingabebildschirme: Modifier.imePadding() auf dem scrollbaren Container, oder safeDrawing, das bereits die IME enthält.
  • Ein unterer Button, der über der Tastatur bleiben muss: Platzieren Sie ihn im bottomBar-Slot des Scaffolds mit Modifier.imePadding(), oder verwenden Sie WindowInsets.ime.union(WindowInsets.navigationBars).
  • Machen Sie den Inhalt scrollbar, damit ein fokussiertes Feld sichtbar wird.

Vollbild-Inhalte

Bilder, Karten, Video- und Kameravorschauen sollten Insets ignorieren und den gesamten Bildschirm füllen. Überlagern Sie Steuerelemente darauf und polstern Sie nur die Steuerelemente mit WindowInsets.safeDrawing.

Kontrast der Systemleistensymbole

Die Leisten sind transparent, daher liegt der Symbolkontrast in Ihrer Verantwortung. Auf Android wählt enableEdgeToEdge() helle oder dunkle Symbole basierend auf dem Systemtheme; wenn die App einen eigenen Theme-Wechsel hat, rufen Sie es erneut mit passenden SystemBarStyles auf, wenn sich das Theme ändert. Bei Drei-Tasten-Navigation fügt Android eine transparente Abdeckung hinzu; behalten Sie diese, es sei denn, die untere Leiste bietet bereits einen festen Hintergrund.

Werbebanner

Ein unteres Banner wird im bottomBar-Slot des Scaffolds platziert, oberhalb des Navigationsleisten-Insets, mit reservierter Höhe, damit der Inhalt nicht springt. Lassen Sie niemals ein Banner unter der Gestenleiste oder überlappend mit Navigationssteuerelementen liegen; das ist sowohl ein Layout-Fehler als auch ein Problem mit den Werberichtlinien.

Checkliste für jeden Bildschirm

  • Der Hintergrund erreicht die oberen und unteren physischen Kanten.
  • Kein Text oder Steuerelement unter der Statusleiste, dem Ausschnitt, der Navigationsleiste oder dem Home-Indikator.
  • Das letzte Listenelement kann vollständig über die untere Leiste scrollen.
  • Fokussierte Textfelder bleiben bei geöffneter Tastatur sichtbar.
  • Sieht im Querformat (Ausschnitt an der Seite) und im dunklen Theme richtig aus.
  • Insets werden einmal angewendet, nicht verdoppelt.

Wenn Googles edge-to-edge-Fähigkeit installiert ist, verwenden Sie diese für Android-spezifische Fehlerbehebung darüber hinaus.

Verwandte Skills