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:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user