fix(app): preserve tab slot state and remove duplicate bottom insets

- Wrap tab crossfade slots in SaveableStateHolder to preserve slot-local state across tab switches

- Remove redundant navigationBarsPadding modifier on ABoxNavigationBar to prevent duplicated bottom spacing
This commit is contained in:
2026-08-25 10:40:35 +08:00
parent 0f91afcbae
commit 6dab84506e
@@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -19,6 +18,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -56,6 +56,7 @@ fun MainAppShell(
) {
var activeTab by rememberSaveable { mutableStateOf(initialTab) }
var showAccountSheet by remember { mutableStateOf(false) }
val tabStateHolder = rememberSaveableStateHolder()
Scaffold(
modifier = modifier.fillMaxSize(),
@@ -77,9 +78,7 @@ fun MainAppShell(
}
},
bottomBar = {
ABoxNavigationBar(
modifier = Modifier.navigationBarsPadding(),
) {
ABoxNavigationBar {
MainTab.values().forEach { tab ->
val isSelected = (tab == activeTab)
ABoxNavigationBarItem(
@@ -111,10 +110,12 @@ fun MainAppShell(
targetState = activeTab,
label = "MainTabCrossfade",
) { tab ->
when (tab) {
MainTab.DEVICES -> devicesSlot()
MainTab.SCENES -> scenesSlot()
MainTab.ACTIVITY -> activitySlot()
tabStateHolder.SaveableStateProvider(tab) {
when (tab) {
MainTab.DEVICES -> devicesSlot()
MainTab.SCENES -> scenesSlot()
MainTab.ACTIVITY -> activitySlot()
}
}
}
}