Tlaster / PreCompose

Compose Multiplatform Navigation && State Management

Home Page:https://tlaster.github.io/PreCompose/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Bug with PopUpTo-Functionality

sawil314 opened this issue · comments

Hi,
I think there is a Bug if you use navigation with PopUpTo, I get an error: "java.lang.IllegalArgumentException: Key 2-screen1 was used multiple times " when I try to navigate twice to the same Scene if it is Poped Up before.
code to reproduce:

package com.example.viewmodel100lines

import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.example.viewmodel100lines.ui.theme.ViewModel100LinesTheme
import moe.tlaster.precompose.lifecycle.PreComposeActivity
import moe.tlaster.precompose.lifecycle.setContent
import moe.tlaster.precompose.navigation.NavHost
import moe.tlaster.precompose.navigation.NavOptions
import moe.tlaster.precompose.navigation.PopUpTo
import moe.tlaster.precompose.navigation.rememberNavigator

class MainActivity : PreComposeActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ViewModel100LinesTheme {
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    App()
                }
            }
        }
    }
}
@Composable
fun App() {
    val navigator = rememberNavigator()
    MaterialTheme {
        NavHost(
            navigator = navigator,
            initialRoute = "screen1"
        ) {
            scene(route = "screen1") {
                Greeting1({ navigator.navigate("screen1") }, { navigator.navigate("screen2") })
            }
            scene(route = "screen2") {
                Greeting2({navigator.navigate("screen1", NavOptions(popUpTo = PopUpTo("screen1"))) })
            }
        }
    }
}


@Composable
fun Greeting1(to1: () -> Unit, to2: () -> Unit, modifier: Modifier = Modifier) {
    Column{
        Button(
            onClick = to1
        ) {
            Text(
                text = "ToScreen1",
                modifier = modifier
            )
        }
        Button(
            onClick = to2
        ) {
            Text(
                text = "ToScreen2",
                modifier = modifier
            )
        }
    }
}

@Composable
fun Greeting2(onClick: () -> Unit, modifier: Modifier = Modifier) {
    Button(
        onClick= onClick
    ){
        Text(
            text = "Screen1",
            modifier = modifier
        )
    }
}

Click:
To Screen2, Screen1, ToScreen1

Seems like a similar bug with #39 , I'm working on it.

@Tlaster still got the same error in my app even after bumping the version to 1.5.4

The next version which contains the fix will be 1.5.5, please wait for the release.