-
NoteI'm not a native English speaker, so I used AI assistance to write this discussion. I apologize if there are any unclear expressions. SummaryWhen using Environment
Reproduction Steps
Video
Minimal Reproduction CodeApp.kt (commonMain)@Composable
fun App() {
val circuit = Circuit.Builder()
.addPresenterFactory(PresenterFactory())
.addUiFactory(UiFactory())
.build()
val backStack = rememberSaveableBackStack(HomeScreen)
val navigator = rememberCircuitNavigator(backStack) {}
CircuitCompositionLocals(circuit) {
NavigableCircuitContent(navigator, backStack)
}
}PresenterFactory.kt (commonMain)class PresenterFactory : Presenter.Factory {
override fun create(
screen: Screen,
navigator: Navigator,
context: CircuitContext
): Presenter<*>? {
return when (screen) {
is HomeScreen -> HomePresenter(navigator)
is SettingsScreen -> SettingsPresenter(navigator)
else -> null
}
}
}UiFactory.kt (commonMain)class UiFactory : Ui.Factory {
override fun create(
screen: Screen,
context: CircuitContext
): Ui<*>? {
return when(screen) {
is HomeScreen -> ui<HomeState> { state, modifier -> Home(state, modifier) }
is SettingsScreen -> ui<SettingsState> { state, modifier -> Settings(state, modifier) }
else -> null
}
}
}HomePresenter.kt (commonMain)@CommonParcelize
object HomeScreen : Screen
data class HomeState(
val count: Int,
val eventSink: (HomeEvent) -> Unit
) : CircuitUiState
sealed interface HomeEvent : CircuitUiEvent {
data object Increase : HomeEvent
data object Decrease : HomeEvent
data object NavigateSettings : HomeEvent
}
class HomePresenter(
val navigator: Navigator,
) : Presenter<HomeState> {
@Composable
override fun present(): HomeState {
// This state is lost after pop() from SettingsScreen
var count by rememberRetained { mutableStateOf(0) }
return HomeState(
count = count,
eventSink = { event ->
when (event) {
HomeEvent.Decrease -> count--
HomeEvent.Increase -> count++
HomeEvent.NavigateSettings -> navigator.goTo(SettingsScreen)
}
}
)
}
}SettingsPresenter.kt (commonMain)@CommonParcelize
object SettingsScreen : Screen
data class SettingsState(
val eventSink: (SettingsEvent) -> Unit,
) : CircuitUiState
sealed interface SettingsEvent : CircuitUiEvent {
data object NavigateBack : SettingsEvent
}
class SettingsPresenter(
val navigator: Navigator
) : Presenter<SettingsState> {
@Composable
override fun present(): SettingsState {
return SettingsState(
eventSink = { event ->
when(event) {
SettingsEvent.NavigateBack -> navigator.pop()
}
}
)
}
} |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 2 replies
-
|
I have the same issue. Can't upgrade the lib. |
Beta Was this translation helpful? Give feedback.
-
|
This is a known bug with some of the underlying runtime changes and will be fixed once we support Compose 1.10. We're not quite at compose 1.10 support yet, just waiting on the stable release of compose-multiplatform. |
Beta Was this translation helpful? Give feedback.
This is a known bug with some of the underlying runtime changes and will be fixed once we support Compose 1.10. We're not quite at compose 1.10 support yet, just waiting on the stable release of compose-multiplatform.
There is a preview alpha based on changes in this PR #2379 which should include the fix for this issue.