Nucleus
Ecosystem

Dialogues de fichiers natifs

Utilisez FileKit pour les dialogues natifs open, save et folder, avec les métadonnées GraalVM fournies par le plugin Nucleus.

Compose Multiplatform n'inclut pas de dialogues de fichiers, et Nucleus n'en ajoute pas non plus. Utilisez FileKit pour les dialogues natifs d'ouverture, d'enregistrement et de sélection de dossier. Le plugin Gradle Nucleus fournit les métadonnées de reachability GraalVM pour FileKit, de sorte que les dialogues fonctionnent sous native-image sans configuration supplémentaire.

Ajouter la dépendance

build.gradle.kts
dependencies {
    implementation("io.github.vinceglb:filekit-compose:<version>")
}

Afficher un sélecteur de fichier

Créez un launcher avec rememberFilePickerLauncher et appelez launch() depuis un gestionnaire de clic :

val launcher = rememberFilePickerLauncher(
    type = PickerType.File(extensions = listOf("png", "jpg")),
    title = "Choisissez une image",
) { file ->
    // file: PlatformFile?
}

Button(onClick = { launcher.launch() }) {
    Text("Choisir une image")
}

Le callback reçoit un PlatformFile?, qui vaut null lorsque l'utilisateur annule. PlatformFile est le handle de fichier cross-plateforme de FileKit, avec des helpers de lecture, d'écriture et de métadonnées.

Fonctionnement

FileKit appelle le dialogue natif sur chaque système d'exploitation :

  • macOSNSOpenPanel et NSSavePanel via Cocoa.
  • WindowsIFileOpenDialog et IFileSaveDialog via JNA COM.
  • Linux — le FileChooser de xdg-desktop-portal, avec repli sur GTK et zenity.

Il prend en charge les filtres de type avec descriptions ; les modes single-file, multi-file, folder et save ; et une API Compose (rememberFilePickerLauncher) construite autour du handle PlatformFile.

Parenter un dialogue à la fenêtre Tao

Depuis 2.3.1, Tao expose les identités plateforme dont FileKit et les dialogues natifs ont besoin pour attacher les sélecteurs à votre fenêtre plutôt que de les laisser flotter indépendamment :

PlateformeAPIValeur
Linux X11 / XWaylandTaoWindow.x11PortalParent ou xdgPortalParent()x11:<xid-hex-minuscule>
Linux WaylandTaoWindow.xdgPortalParent() / exportXdgForeignHandle()wayland:<token xdg_foreign>
macOSTaoWindow.nsWindowHandlele NSWindow* propriétaire (pas le NSView* Compose)
WindowsTaoWindow.nativeHandleHWND
// Préférez le helper agnostique du backend sous Linux :
val parent = window.xdgPortalParent()
// X11 → XdgPortalParent.X11(xid) ; Wayland → XdgPortalParent.Wayland(export)
// Gardez un export Wayland ouvert jusqu'à la fin du dialogue portal, puis fermez-le.
(parent as? AutoCloseable)?.close()

// Parent de sheet macOS (une fois que FileKit accepte un parent NSWindow) :
// window.nsWindowHandle?.let { FileKitDialogParent.macos(it) }

Sous Wayland, exportXdgForeignHandle() / XdgPortalParent.Wayland encapsule un XdgForeignExport qui doit rester ouvert tant que le dialogue portal emprunte son handle. Un wl_surface* brut ou le NSView* Compose n'est pas un parent portal / sheet valide.

Exécuter sous GraalVM native image

Le plugin Gradle Nucleus fournit les métadonnées de reachability pour FileKit dans son bundle de métadonnées de bibliothèques. Les métadonnées ne sont incluses que lorsque io.github.vinceglb.filekit est présent sur le classpath d'exécution, et couvrent :

  • Les types de proxy et de callback Foundation sur macOS (FoundationLibrary, ID, callbacks runnable).
  • Les bindings COM JNA Windows (FileDialog, FileOpenDialog, FileSaveDialog, ShellItem, Shell32, COMDLG_FILTERSPEC, PROPERTYKEY).
  • Le proxy D-Bus xdg-desktop-portal pour Linux (FileChooserDbusInterface).

Lorsque vous construisez avec le plugin Nucleus et que vous ciblez native-image, les dialogues fonctionnent sans reachability-metadata.json manuel ni passage du tracing-agent.

Notes

FileKit encapsule déjà chaque dialogue natif et s'intègre à l'état Compose, donc Nucleus en dépend plutôt que de réimplémenter la même surface.

Et ensuite