6
votes

Comment définir une fonction js globale dans Kotlin?

Chaque fonction et variable que je crée dans le projet KotlinJs entre dans un module. Mais j'ai besoin de définir certaines fonctions dans une portée globale.

J'utilise la bibliothèque p5js (pure js). Il permet à l'utilisateur de définir des fonctions de gestion d'événements dans une portée globale. J'essaye d'utiliser KotlinJS dans ce projet. Mais je ne sais pas comment créer des fonctions globales pour gérer les événements de p5js. Toutes mes fonctions Kotlin sont à l'intérieur du module. Et pour appeler mon code Kotlin, je dois spécifier le nom complet mymodule.draw()

Actuellement, je dois créer une couche supplémentaire de code JS pur avec des fonctions globales qui traduisent l'exécution aux fonctions kotlin qui ressemblent à ceci:

function setup() {
    mymodule.setup();
}

function draw() {
    mymodule.draw();
}

Le problème avec cette approche est beaucoup de code standard et répétitif.


2 commentaires

Il semble que ce soit un cas d'utilisation non conventionnel lorsque la bibliothèque appelle votre code qui doit être mis en forme comme des fonctions dans une portée globale. OMI, Kotlin devrait s'en tenir à la génération de modules JS idiomatiques et une simple couche de colle JS est la meilleure voie à suivre. Il est plus facile d'adapter JS à votre Kotlin que d'adapter Kotlin à votre JS.


On dirait qu'il existe un mode instance où vous ne pas besoin d'avoir des fonctions globales


3 Réponses :


5
votes

Dans le cas où cela serait utile pour quelqu'un, je laisserai une autre solution de contournement ici:

import kotlin.browser.window

fun main() {
    window.asDynamic()["setup"] = ::setup
    window.asDynamic()["draw"] = ::draw
}

fun setup() {}
fun draw() {}

Ce qu'il fait réellement, il crée des fonctions dans le module kotlin comme d'habitude, puis les affecte à l'objet window, ce qui la rend globale.

Cette solution n'est toujours pas idéale, car elle nécessite une affectation manuelle pour chaque fonction. Au moins, il le fait correctement dans le projet Kotlin, pas besoin de maintenir un fichier js pur séparé. Peut-être est-il possible de créer une annotation et de tirer parti de la réflexion kotlin (aucune idée de la manière dont elle est prise en charge dans KotlinJS).

Bien que cette solution fonctionne pour moi, j'aimerais avoir une solution prête à l'emploi comme ils le font pour les fonctions externes @JsNonModule .


0 commentaires

2
votes

Malheureusement, il n'y a aucun moyen de définir une fonction globale dans Kotlin / JS. Il est possible d'utiliser le type de module Plain où vous avez des symboles globaux dans l'objet module qui est défini dans la portée globale.

// module M
fun foo() {}

qui est accessible via M.foo p>


0 commentaires

1
votes

En ajoutant en plus de la réponse de @ Sergey, on peut également utiliser ce travail pour traiter des bibliothèques comme p5.js

fun main() {
    window.asDynamic().setup = {
        // your setup code here
    }

    window.asDynamic().draw = {
        // your draw code here
    }
}

Cette approche minimise la définition et la déclaration des deux fonctions ( en vous regardant en langage C). Merci


0 commentaires