pref(MainPage): 去除非 `@Stable` 的参数

This commit is contained in:
HuanCheng65 2023-07-11 11:43:47 +08:00
parent 5249723790
commit c541dbbbd6
No known key found for this signature in database
GPG Key ID: 5EC9DD60A32C7360
3 changed files with 33 additions and 21 deletions

View File

@ -24,6 +24,8 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.stringResource
@ -83,6 +85,8 @@ import kotlinx.coroutines.launch
val LocalNotificationCountFlow =
staticCompositionLocalOf<Flow<Int>> { throw IllegalStateException("not allowed here!") }
val LocalDevicePosture =
staticCompositionLocalOf<State<DevicePosture>> { throw IllegalStateException("not allowed here!") }
@AndroidEntryPoint
class MainActivityV2 : BaseComposeActivity() {
@ -219,7 +223,10 @@ class MainActivityV2 : BaseComposeActivity() {
okSignAlertDialogState.show()
}
}
CompositionLocalProvider(LocalNotificationCountFlow provides notificationCountFlow) {
CompositionLocalProvider(
LocalNotificationCountFlow provides notificationCountFlow,
LocalDevicePosture provides devicePostureFlow.collectAsState(),
) {
Surface(
color = ExtendedTheme.colors.background
) {
@ -274,7 +281,6 @@ class MainActivityV2 : BaseComposeActivity() {
engine = engine,
dependenciesContainerBuilder = {
dependency(MainPageDestination) { this@MainActivityV2 }
dependency(devicePostureFlow)
}
)
}

View File

@ -19,7 +19,6 @@ import androidx.compose.material.icons.rounded.Inventory2
import androidx.compose.material.icons.rounded.Notifications
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@ -30,6 +29,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import com.huanchengfly.tieba.post.LocalDevicePosture
import com.huanchengfly.tieba.post.LocalNotificationCountFlow
import com.huanchengfly.tieba.post.R
import com.huanchengfly.tieba.post.arch.BaseComposeActivity.Companion.LocalWindowSizeClass
@ -50,8 +50,9 @@ import com.huanchengfly.tieba.post.utils.appPreferences
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootNavGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
@Composable
@ -59,7 +60,7 @@ private fun NavigationWrapper(
currentPosition: Int,
onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>,
navigationItems: ImmutableList<NavigationItem>,
navigationType: MainNavigationType,
navigationContentPosition: MainNavigationContentPosition,
content: @Composable () -> Unit,
@ -97,7 +98,6 @@ private fun NavigationWrapper(
@Composable
fun MainPage(
navigator: DestinationsNavigator,
devicePostureFlow: StateFlow<DevicePosture>,
viewModel: MainViewModel = pageViewModel<MainUiIntent, MainViewModel>(emptyList()),
) {
val messageCount by viewModel.uiState.collectPartialAsState(
@ -125,11 +125,12 @@ fun MainPage(
val coroutineScope = rememberCoroutineScope()
val themeColors = ExtendedTheme.colors
val windowSizeClass = LocalWindowSizeClass.current
val foldingDevicePosture by devicePostureFlow.collectAsState()
val foldingDevicePosture by LocalDevicePosture.current
val navigationItems = listOfNotNull(
NavigationItem(
id = "home",
icon = { if (it) Icons.Rounded.Inventory2 else Icons.Outlined.Inventory2 },
title = stringResource(id = R.string.title_main),
title = { stringResource(id = R.string.title_main) },
content = {
HomePage(
eventFlow = eventFlows[0],
@ -143,19 +144,21 @@ fun MainPage(
),
if (LocalContext.current.appPreferences.hideExplore) null
else NavigationItem(
id = "explore",
icon = {
if (it) ImageVector.vectorResource(id = R.drawable.ic_round_toys) else ImageVector.vectorResource(
id = R.drawable.ic_outline_toys
)
},
title = stringResource(id = R.string.title_explore),
title = { stringResource(id = R.string.title_explore) },
content = {
ExplorePage(eventFlows[1])
}
),
NavigationItem(
id = "notification",
icon = { if (it) Icons.Rounded.Notifications else Icons.Outlined.Notifications },
title = stringResource(id = R.string.title_notifications),
title = { stringResource(id = R.string.title_notifications) },
badge = messageCount > 0,
badgeText = "$messageCount",
onClick = {
@ -166,13 +169,14 @@ fun MainPage(
}
),
NavigationItem(
id = "user",
icon = { if (it) Icons.Rounded.AccountCircle else Icons.Outlined.AccountCircle },
title = stringResource(id = R.string.title_user),
title = { stringResource(id = R.string.title_user) },
content = {
UserPage()
}
),
)
).toImmutableList()
val navigationType = when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> {
@ -245,7 +249,7 @@ fun MainPage(
contentPadding = paddingValues,
pageCount = navigationItems.size,
state = pagerState,
key = { navigationItems[it].title },
key = { navigationItems[it].id },
modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.Top,
userScrollEnabled = false

View File

@ -55,6 +55,7 @@ import com.huanchengfly.tieba.post.ui.widgets.compose.AccountNavIcon
import com.huanchengfly.tieba.post.ui.widgets.compose.Avatar
import com.huanchengfly.tieba.post.ui.widgets.compose.Sizes
import com.huanchengfly.tieba.post.utils.AccountUtil.LocalAccount
import kotlinx.collections.immutable.ImmutableList
enum class LayoutType {
HEADER, CONTENT
@ -130,7 +131,7 @@ fun NavigationDrawerContent(
currentPosition: Int,
onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>,
navigationItems: ImmutableList<NavigationItem>,
navigationContentPosition: MainNavigationContentPosition
) {
PositionLayout(
@ -199,12 +200,12 @@ fun NavigationDrawerContent(
onChangePosition(index)
}
},
label = { Text(text = navigationItem.title) },
label = { Text(text = navigationItem.title(index == currentPosition)) },
icon = {
Box {
Icon(
imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title
contentDescription = navigationItem.title(index == currentPosition)
)
if (navigationItem.badge) {
Text(
@ -283,7 +284,7 @@ fun NavigationRail(
currentPosition: Int,
onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>,
navigationItems: ImmutableList<NavigationItem>,
navigationContentPosition: MainNavigationContentPosition
) {
NavigationRail(
@ -315,7 +316,7 @@ fun NavigationRail(
Box {
Icon(
imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title
contentDescription = navigationItem.title(index == currentPosition)
)
if (navigationItem.badge) {
Text(
@ -360,7 +361,7 @@ fun BottomNavigation(
currentPosition: Int,
onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>,
navigationItems: ImmutableList<NavigationItem>,
themeColors: ExtendedColors = ExtendedTheme.colors
) {
Column(modifier = Modifier.navigationBarsPadding()) {
@ -384,7 +385,7 @@ fun BottomNavigation(
Box {
Icon(
imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title
contentDescription = navigationItem.title(index == currentPosition)
)
if (navigationItem.badge) {
Text(
@ -414,8 +415,9 @@ fun BottomNavigation(
}
data class NavigationItem(
val id: String,
val icon: @Composable (selected: Boolean) -> ImageVector,
val title: String,
val title: @Composable (selected: Boolean) -> String,
val badge: Boolean = false,
val badgeText: String? = null,
val onClick: (() -> Unit)? = null,