Wojtek K
Wojtek K

Reputation: 141

Type mismatch in lambda function - Kotlin

I want the text to be taken from string resource, depends on item.route, which is specified before bellow code.

But whole "when" expression gives me the error: "Type mismatch: inferred type is () -> Int but Int was expected." I don't have idea how to resolve it.


Text(
        text = stringResource(id = {
            when (item.route) {
                "menu_screen" -> R.string.menu
                "orders_screen" -> R.string.orders
                else -> R.string.orders
            }
        }),
        textAlign = TextAlign.Center
    )

Upvotes: 2

Views: 1114

Answers (2)

Tenfour04
Tenfour04

Reputation: 93902

When you put bare brackets { } around something, it is interpreted as a lambda function. By "bare" I mean not after a class/fun/when/if/else, etc. You need to remove the extra brackets you put in there.

Text(
    text = stringResource(id = 
        when (item.route) {
            "menu_screen" -> R.string.menu
            "orders_screen" -> R.string.orders
            else -> R.string.orders
        }
    ),
    textAlign = TextAlign.Center
)

Some other languages (such as Java) let you surround code with brackets to limit the scope of variables declared inside or to compute something that takes multiple expressions. To do this in Kotlin, you have to use a scope inline function such as run { }.

Upvotes: 1

nglauber
nglauber

Reputation: 24044

Just remove the extra curly brace ;)

Text(
    text = stringResource(id = 
        when (item.route) {
            "menu_screen" -> R.string.menu
            "orders_screen" -> R.string.orders
            else -> R.string.orders
        }
    ),
    textAlign = TextAlign.Center
)

Upvotes: 1

Related Questions