Fix connection details screen flickering on navigation

Use reference counting for visibility state so both ConnectionsScreen
and ConnectionDetailsRoute can manage visibility without conflicts.
This commit is contained in:
世界
2026-01-19 13:19:41 +08:00
parent 47c8bd624c
commit 41d919bfe3
2 changed files with 17 additions and 7 deletions

View File

@@ -306,6 +306,16 @@ fun ConnectionDetailsRoute(
)
}
LaunchedEffect(Unit) {
viewModel.setVisible(true)
}
DisposableEffect(Unit) {
onDispose {
viewModel.setVisible(false)
}
}
LaunchedEffect(serviceStatus) {
viewModel.updateServiceStatus(serviceStatus)
}

View File

@@ -51,7 +51,7 @@ class ConnectionsViewModel :
val serviceStatus = _serviceStatus.asStateFlow()
private var lastServiceStatus: Status = Status.Stopped
private val _isVisible = MutableStateFlow(false)
private val _visibleCount = MutableStateFlow(0)
private var connectionsStore: Connections? = null
private val connectionsMutex = Mutex()
@@ -63,12 +63,12 @@ class ConnectionsViewModel :
viewModelScope.launch {
combine(
AppLifecycleObserver.isForeground,
_isVisible,
_visibleCount,
_serviceStatus,
) { foreground, visible, status ->
Triple(foreground, visible, status)
}.collect { (foreground, visible, status) ->
val shouldConnect = foreground && visible && status == Status.Started
) { foreground, visibleCount, status ->
Triple(foreground, visibleCount, status)
}.collect { (foreground, visibleCount, status) ->
val shouldConnect = foreground && visibleCount > 0 && status == Status.Started
if (shouldConnect) {
updateState { copy(isLoading = true) }
commandClient.connect()
@@ -80,7 +80,7 @@ class ConnectionsViewModel :
}
fun setVisible(visible: Boolean) {
_isVisible.value = visible
_visibleCount.value += if (visible) 1 else -1
}
override fun onCleared() {