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.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -83,6 +85,8 @@ import kotlinx.coroutines.launch
val LocalNotificationCountFlow = val LocalNotificationCountFlow =
staticCompositionLocalOf<Flow<Int>> { throw IllegalStateException("not allowed here!") } staticCompositionLocalOf<Flow<Int>> { throw IllegalStateException("not allowed here!") }
val LocalDevicePosture =
staticCompositionLocalOf<State<DevicePosture>> { throw IllegalStateException("not allowed here!") }
@AndroidEntryPoint @AndroidEntryPoint
class MainActivityV2 : BaseComposeActivity() { class MainActivityV2 : BaseComposeActivity() {
@ -219,7 +223,10 @@ class MainActivityV2 : BaseComposeActivity() {
okSignAlertDialogState.show() okSignAlertDialogState.show()
} }
} }
CompositionLocalProvider(LocalNotificationCountFlow provides notificationCountFlow) { CompositionLocalProvider(
LocalNotificationCountFlow provides notificationCountFlow,
LocalDevicePosture provides devicePostureFlow.collectAsState(),
) {
Surface( Surface(
color = ExtendedTheme.colors.background color = ExtendedTheme.colors.background
) { ) {
@ -274,7 +281,6 @@ class MainActivityV2 : BaseComposeActivity() {
engine = engine, engine = engine,
dependenciesContainerBuilder = { dependenciesContainerBuilder = {
dependency(MainPageDestination) { this@MainActivityV2 } 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.material.icons.rounded.Notifications
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope 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.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import com.huanchengfly.tieba.post.LocalDevicePosture
import com.huanchengfly.tieba.post.LocalNotificationCountFlow import com.huanchengfly.tieba.post.LocalNotificationCountFlow
import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.R
import com.huanchengfly.tieba.post.arch.BaseComposeActivity.Companion.LocalWindowSizeClass 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.Destination
import com.ramcosta.composedestinations.annotation.RootNavGraph import com.ramcosta.composedestinations.annotation.RootNavGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator 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.MutableSharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
@ -59,7 +60,7 @@ private fun NavigationWrapper(
currentPosition: Int, currentPosition: Int,
onChangePosition: (position: Int) -> Unit, onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit, onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>, navigationItems: ImmutableList<NavigationItem>,
navigationType: MainNavigationType, navigationType: MainNavigationType,
navigationContentPosition: MainNavigationContentPosition, navigationContentPosition: MainNavigationContentPosition,
content: @Composable () -> Unit, content: @Composable () -> Unit,
@ -97,7 +98,6 @@ private fun NavigationWrapper(
@Composable @Composable
fun MainPage( fun MainPage(
navigator: DestinationsNavigator, navigator: DestinationsNavigator,
devicePostureFlow: StateFlow<DevicePosture>,
viewModel: MainViewModel = pageViewModel<MainUiIntent, MainViewModel>(emptyList()), viewModel: MainViewModel = pageViewModel<MainUiIntent, MainViewModel>(emptyList()),
) { ) {
val messageCount by viewModel.uiState.collectPartialAsState( val messageCount by viewModel.uiState.collectPartialAsState(
@ -125,11 +125,12 @@ fun MainPage(
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val themeColors = ExtendedTheme.colors val themeColors = ExtendedTheme.colors
val windowSizeClass = LocalWindowSizeClass.current val windowSizeClass = LocalWindowSizeClass.current
val foldingDevicePosture by devicePostureFlow.collectAsState() val foldingDevicePosture by LocalDevicePosture.current
val navigationItems = listOfNotNull( val navigationItems = listOfNotNull(
NavigationItem( NavigationItem(
id = "home",
icon = { if (it) Icons.Rounded.Inventory2 else Icons.Outlined.Inventory2 }, 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 = { content = {
HomePage( HomePage(
eventFlow = eventFlows[0], eventFlow = eventFlows[0],
@ -143,19 +144,21 @@ fun MainPage(
), ),
if (LocalContext.current.appPreferences.hideExplore) null if (LocalContext.current.appPreferences.hideExplore) null
else NavigationItem( else NavigationItem(
id = "explore",
icon = { icon = {
if (it) ImageVector.vectorResource(id = R.drawable.ic_round_toys) else ImageVector.vectorResource( if (it) ImageVector.vectorResource(id = R.drawable.ic_round_toys) else ImageVector.vectorResource(
id = R.drawable.ic_outline_toys id = R.drawable.ic_outline_toys
) )
}, },
title = stringResource(id = R.string.title_explore), title = { stringResource(id = R.string.title_explore) },
content = { content = {
ExplorePage(eventFlows[1]) ExplorePage(eventFlows[1])
} }
), ),
NavigationItem( NavigationItem(
id = "notification",
icon = { if (it) Icons.Rounded.Notifications else Icons.Outlined.Notifications }, 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, badge = messageCount > 0,
badgeText = "$messageCount", badgeText = "$messageCount",
onClick = { onClick = {
@ -166,13 +169,14 @@ fun MainPage(
} }
), ),
NavigationItem( NavigationItem(
id = "user",
icon = { if (it) Icons.Rounded.AccountCircle else Icons.Outlined.AccountCircle }, 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 = { content = {
UserPage() UserPage()
} }
), ),
) ).toImmutableList()
val navigationType = when (windowSizeClass.widthSizeClass) { val navigationType = when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> { WindowWidthSizeClass.Compact -> {
@ -245,7 +249,7 @@ fun MainPage(
contentPadding = paddingValues, contentPadding = paddingValues,
pageCount = navigationItems.size, pageCount = navigationItems.size,
state = pagerState, state = pagerState,
key = { navigationItems[it].title }, key = { navigationItems[it].id },
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.Top, verticalAlignment = Alignment.Top,
userScrollEnabled = false 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.Avatar
import com.huanchengfly.tieba.post.ui.widgets.compose.Sizes import com.huanchengfly.tieba.post.ui.widgets.compose.Sizes
import com.huanchengfly.tieba.post.utils.AccountUtil.LocalAccount import com.huanchengfly.tieba.post.utils.AccountUtil.LocalAccount
import kotlinx.collections.immutable.ImmutableList
enum class LayoutType { enum class LayoutType {
HEADER, CONTENT HEADER, CONTENT
@ -130,7 +131,7 @@ fun NavigationDrawerContent(
currentPosition: Int, currentPosition: Int,
onChangePosition: (position: Int) -> Unit, onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit, onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>, navigationItems: ImmutableList<NavigationItem>,
navigationContentPosition: MainNavigationContentPosition navigationContentPosition: MainNavigationContentPosition
) { ) {
PositionLayout( PositionLayout(
@ -199,12 +200,12 @@ fun NavigationDrawerContent(
onChangePosition(index) onChangePosition(index)
} }
}, },
label = { Text(text = navigationItem.title) }, label = { Text(text = navigationItem.title(index == currentPosition)) },
icon = { icon = {
Box { Box {
Icon( Icon(
imageVector = navigationItem.icon(index == currentPosition), imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title contentDescription = navigationItem.title(index == currentPosition)
) )
if (navigationItem.badge) { if (navigationItem.badge) {
Text( Text(
@ -283,7 +284,7 @@ fun NavigationRail(
currentPosition: Int, currentPosition: Int,
onChangePosition: (position: Int) -> Unit, onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit, onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>, navigationItems: ImmutableList<NavigationItem>,
navigationContentPosition: MainNavigationContentPosition navigationContentPosition: MainNavigationContentPosition
) { ) {
NavigationRail( NavigationRail(
@ -315,7 +316,7 @@ fun NavigationRail(
Box { Box {
Icon( Icon(
imageVector = navigationItem.icon(index == currentPosition), imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title contentDescription = navigationItem.title(index == currentPosition)
) )
if (navigationItem.badge) { if (navigationItem.badge) {
Text( Text(
@ -360,7 +361,7 @@ fun BottomNavigation(
currentPosition: Int, currentPosition: Int,
onChangePosition: (position: Int) -> Unit, onChangePosition: (position: Int) -> Unit,
onReselected: (position: Int) -> Unit, onReselected: (position: Int) -> Unit,
navigationItems: List<NavigationItem>, navigationItems: ImmutableList<NavigationItem>,
themeColors: ExtendedColors = ExtendedTheme.colors themeColors: ExtendedColors = ExtendedTheme.colors
) { ) {
Column(modifier = Modifier.navigationBarsPadding()) { Column(modifier = Modifier.navigationBarsPadding()) {
@ -384,7 +385,7 @@ fun BottomNavigation(
Box { Box {
Icon( Icon(
imageVector = navigationItem.icon(index == currentPosition), imageVector = navigationItem.icon(index == currentPosition),
contentDescription = navigationItem.title contentDescription = navigationItem.title(index == currentPosition)
) )
if (navigationItem.badge) { if (navigationItem.badge) {
Text( Text(
@ -414,8 +415,9 @@ fun BottomNavigation(
} }
data class NavigationItem( data class NavigationItem(
val id: String,
val icon: @Composable (selected: Boolean) -> ImageVector, val icon: @Composable (selected: Boolean) -> ImageVector,
val title: String, val title: @Composable (selected: Boolean) -> String,
val badge: Boolean = false, val badge: Boolean = false,
val badgeText: String? = null, val badgeText: String? = null,
val onClick: (() -> Unit)? = null, val onClick: (() -> Unit)? = null,