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) { LaunchedEffect(serviceStatus) {
viewModel.updateServiceStatus(serviceStatus) viewModel.updateServiceStatus(serviceStatus)
} }

View File

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