Как использовать MessageEventInit с window.addEventListener - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь зарегистрировать канал веб-сообщений, используя kotlin - js, но не могу определить, как получить доступ к типу MessageEventInit.

https://kotlinlang.org/api/latest/jvm/stdlib/org.w3c.dom/-message-event-init/index.html

Метод window.addEventListener предоставляет только обобщенный c Event тип

https://kotlinlang.org/api/latest/jvm/stdlib/org.w3c.dom.events/-event-target/add-event-listener.html

fun addEventListener(
    type: String,
    callback: EventListener?,
    options: dynamic = definedExternally)
fun addEventListener(
    type: String,
    callback: ((Event) -> Unit)?,
    options: dynamic = definedExternally)

Это то, что До сих пор я придумал, но мне сложно построить проект.

fun configureChannel() {
    val channel = MessageChannel()
    var jsPortOne = channel.port1
    var jsPortTwo = channel.port2

    window.addEventListener("message", {
    }, false)

    jsPortOne.addEventListener("message", {
        window.alert((it as MessageEvent).data.toString())
    }, false)

    jsPortTwo.addEventListener("message", {
        window.alert((it as MessageEvent).data.toString())
    }, false)

    jsPortOne.start()
    jsPortTwo.start()
}

Моя основная цель - преобразовать этот файл в Kotlin / JS и объединить его с этим kotlin android проект

https://github.com/darran-kelinske-fivestars/cordova-alternative-pattern/blob/master/app/src/main/assets/js/index.js

1 Ответ

0 голосов
/ 07 марта 2020

Предчувствие было верным. Мне удалось получить проект здания и развернуть. Чтобы использовать тип MessageEvent в Kotlin / JS, вам нужно привести событие к MessageEvent

val event = it as MessageEvent

Вот пример:

@JsName("configureChannel")
fun configureChannel() {
    console.log("Configuring channel")
    window.addEventListener("message", {

        val event = it as MessageEvent

        if (event.data != KEY_CAPTURE_PORT) {
            console.log("event.data: ${event.data}")
            inputPort.postMessage(event.data)
        } else if (event.data == KEY_CAPTURE_PORT) {
            console.log("assigning captured port")
            outputPort = event.ports[0]
        }
    }, false)

    inputPort.start()
    outputPort.start()
}
...