pref(MainPage): 去除非 `@Stable` 的参数
This commit is contained in:
parent
5249723790
commit
c541dbbbd6
|
|
@ -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)
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue