How to extract some code to local variables in Kotlin when using Ktor HTML builder?

I am trying to understand the HTML constructor in Kotlin / Ktor. The example here uses an HTML builder to plot the result:

call.respondHtml {
    head {
        title { +"HTML Application" }
    }
    body {
        h1 { +"Sample application with HTML builders" }
        widget {
            +"Widgets are just functions"
        }
    }
}

      

I am trying to extract the body into a variable like this:

val block: HTML.() -> Unit = {
    head {
        title { +"HTML Application" }
    }
    body {
        h1 { +"Sample application with HTML builders" }
    }
}
call.respondHtml(block)

      

Now I am getting the following compilation error:

Error:(37, 22) Kotlin: None of the following functions can be called with the arguments supplied: 
public suspend fun ApplicationCall.respondHtml(status: HttpStatusCode = ..., versions: List<Version> = ..., cacheControl: CacheControl? = ..., block: HTML.() -> Unit): Unit defined in org.jetbrains.ktor.html
public suspend fun ApplicationCall.respondHtml(status: HttpStatusCode = ..., block: HTML.() -> Unit): Unit defined in org.jetbrains.ktor.html

      

When I add the first (optional) argument, it works again call.respondHtml(HttpStatusCode.OK, block)

.

Why doesn't it work when I just try to extract the body into a variable?

+3


source to share


2 answers


I think the compiler doesn't like to have required defaults unless it's a lambda outside of curly braces.

Try calling it:



call.respondHtml(block = block)

      

+3


source


By the way, if you want to extract logic, I would recommend using functions. For your example:

fun HTML.headAndBody() {
    head {
        title { +"HTML Application" }
    }
    body {
        h1 { +"Sample application with HTML builders" }
        widget {
            +"Widgets are just functions"
        }
    }
}

call.respondHtml {
    headAndBody()
}

      



This way, you can even add parameters to your html block by creating a custom component from it.

+2


source







All Articles