0

I'm brand new to Kotlin. I wanted to try the create-react-kotlin-app since I'm a react developer currently and I want to explore Kotlin.

I'm having a tough time instaniating my variables. I'm trying to do this:

fun main(args: Array<String>) {
    val rootDiv = document.getElementById("root")
    val gm : GameUiProps
    gm.numPlayers = 2
    gm.cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
    gm.playerArray = arrayOf("Player 1", "Player 2")

    RBuilder.render(rootDiv) {
        GameUi(gm)
    }
}

My gm variable isn't being initialized and I can't figure how how to do it.

I need to initiazle my GameUi component with props, but I can't figure out how to do that.

So GameUiProps comes from my component

interface GameUiProps : RProps {
    var numPlayers: Int
    var playerArray: Array<String>
    var cardArray: Array<String>
}

class GameUi(props: GameUiProps) : RComponent<GameUiProps, RState>(props) {

    private fun RBuilder.createHands() {
        var numPlayers = props.numPlayers
        val handArray: ArrayList<Unit> = ArrayList()
        while (numPlayers > 0) {
            handArray.add(
                    handUi(
                            props.playerArray[numPlayers],
                            props.cardArray[numPlayers]
                    )
            )
            numPlayers--
        }
    }

    override fun RBuilder.render() {
        div {
            h1("sweet") {
                +"RKT"
            }
            div {
                createHands()
            }
        }
    }
}
Sean Kelly
  • 901
  • 7
  • 27

2 Answers2

1

Your GameUiProps is just an interface, so you cannot instantiate it directly.

What you have (val gm: GameUiProps) is just field declaration without assigning anything to it. You obviously cannot access nor write any properties to it.

You need to either create a simple implementation with constructor, or an anonymous object.

Class that declares all interface fields in the constructor:

class GameUiPropsImpl(
    override var numPlayers: Int, 
    override var playerArray: Array<String>, 
    override var cardArray: Array<String>) : GameUiProps

then in your fun main:

val gm = GameUiPropsImpl(2, arrayOf("Player 1", "Player 2"), arrayOf("Card to be dealt", "Cards to be Dealt"))

Or using an anonymous class implementing the interface:

val gm = object: GameUiProps{
    override var numPlayers = 2
    override var playerArray = arrayOf("Player 1", "Player 2")
    override var cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
}
Zoe
  • 27,060
  • 21
  • 118
  • 148
Pawel
  • 15,548
  • 3
  • 36
  • 36
0

It has been a while, but for anyone who might need this, you just need to assign the variable gm to an object of type GameUiProps. Below is what I would have done.

val gm = object : GameUiProps{
   override var numPlayers = 2
   override var cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
   override var playerArray = arrayOf("Player 1", "Player 2")
}

Hope it helps!

Kochez
  • 673
  • 4
  • 10