fix:开了折叠应用栏后下拉刷新的问题 (#1629)

This commit is contained in:
fansan
2026-07-01 23:34:27 +08:00
committed by GitHub
parent 366d547bcd
commit 7ca241e1ae
9 changed files with 51 additions and 20 deletions
@@ -288,7 +288,8 @@ fun ExploreShowScreen(
modifier = Modifier.fillMaxSize(),
isRefreshing = state.isRefreshing,
onRefresh = { viewModel.onIntent(ExploreShowIntent.Refresh) },
topPadding = paddingValues.calculateTopPadding()
topPadding = paddingValues.calculateTopPadding(),
scrollBehavior = scrollBehavior
) {
Crossfade(
targetState = isGridMode,
@@ -71,6 +71,7 @@ import io.legado.app.ui.widget.components.list.ListScaffold
import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import io.legado.app.ui.widget.components.text.AppText
import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
import io.legado.app.ui.widget.components.topbar.TopBarActionButton
import io.legado.app.utils.ConvertUtils
import io.legado.app.utils.startActivityForBook
@@ -98,9 +99,11 @@ private fun ImportBookContent(
onDeleteSelection: () -> Unit,
onItemClick: (ImportBook) -> Unit
) {
val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
ListScaffold(
title = state.pathNames.lastOrNull() ?: stringResource(R.string.local_book),
state = state,
scrollBehavior = scrollBehavior,
onBackClick = onBackClick,
onSearchToggle = onSearchToggle,
onSearchQueryChange = onSearchQueryChange,
@@ -197,7 +200,8 @@ private fun ImportBookContent(
.padding(paddingValues),
isRefreshing = state.isLoading,
onRefresh = onScanFolder,
topPadding = paddingValues.calculateTopPadding()
topPadding = paddingValues.calculateTopPadding(),
scrollBehavior = scrollBehavior
) {
when {
state.items.isEmpty() && state.isLoading -> {
@@ -87,6 +87,7 @@ import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import io.legado.app.ui.widget.components.text.AppText
import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
import io.legado.app.ui.widget.components.topbar.TopBarActionButton
import io.legado.app.utils.ConvertUtils
import io.legado.app.utils.startActivityForBook
@@ -209,6 +210,8 @@ fun RemoteBookScreen(
}
}
val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
LaunchedEffect(viewModel) {
viewModel.dispatch(RemoteBookIntent.Initialize)
viewModel.effects.collect { effect ->
@@ -252,6 +255,7 @@ fun RemoteBookScreen(
ListScaffold(
title = "远程书籍",
state = uiState,
scrollBehavior = scrollBehavior,
onBackClick = onBackClick,
onSearchToggle = { viewModel.dispatch(RemoteBookIntent.SearchToggle(it)) },
onSearchQueryChange = { viewModel.dispatch(RemoteBookIntent.SearchChange(it)) },
@@ -322,7 +326,8 @@ fun RemoteBookScreen(
.padding(paddingValues),
isRefreshing = uiState.isLoading,
onRefresh = { viewModel.dispatch(RemoteBookIntent.Refresh) },
topPadding = paddingValues.calculateTopPadding()
topPadding = paddingValues.calculateTopPadding(),
scrollBehavior = scrollBehavior
) {
if (uiState.items.isEmpty()) {
if (uiState.isLoading) {
@@ -193,7 +193,8 @@ private fun BookInfoScreenContent(
modifier = Modifier.fillMaxSize(),
isRefreshing = state.isTocLoading,
onRefresh = { onIntent(BookInfoIntent.MenuAction(BookInfoMenuAction.Refresh)) },
topPadding = paddingValues.calculateTopPadding()
topPadding = paddingValues.calculateTopPadding(),
scrollBehavior = scrollBehavior
) {
LazyColumn(
state = listState,
@@ -717,7 +717,8 @@ fun BookshelfScreen(
isRefreshing = uiState.isRefreshing,
onRefresh = { viewModel.refreshBooks(uiState.items) },
enabled = pullToRefreshEnabled,
topPadding = paddingValues.calculateTopPadding()
topPadding = paddingValues.calculateTopPadding(),
scrollBehavior = scrollBehavior
) {
folderTransition.AnimatedContent(
transitionSpec = {
@@ -452,6 +452,7 @@ fun HomeScreen(
isRefreshing = homepageState.isRefreshing,
onRefresh = onRefreshHomepage,
modifier = Modifier.fillMaxSize(),
scrollBehavior = scrollBehavior,
) {
BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
val dashboardScrollState = rememberScrollState()
@@ -21,6 +21,9 @@ import androidx.compose.ui.unit.dp
import io.legado.app.R
import io.legado.app.ui.theme.LegadoTheme.composeEngine
import io.legado.app.ui.theme.ThemeResolver
import io.legado.app.ui.widget.components.topbar.GlassTopAppBarScrollBehavior
import io.legado.app.ui.widget.components.topbar.M3GlassScrollBehavior
import io.legado.app.ui.widget.components.topbar.MiuixGlassScrollBehavior
import kotlinx.coroutines.delay
import top.yukonga.miuix.kmp.basic.PullToRefresh as MiuixPullToRefresh
import top.yukonga.miuix.kmp.basic.rememberPullToRefreshState as miuixRememberPullToRefreshState
@@ -33,6 +36,7 @@ fun AppPullToRefresh(
modifier: Modifier = Modifier,
enabled: Boolean = true,
topPadding: Dp = 0.dp,
scrollBehavior: GlassTopAppBarScrollBehavior? = null,
content: @Composable () -> Unit,
) {
if (ThemeResolver.isMiuixEngine(composeEngine)) {
@@ -58,6 +62,7 @@ fun AppPullToRefresh(
modifier = modifier,
contentPadding = PaddingValues(top = topPadding + 16.dp),
pullToRefreshState = miuixRememberPullToRefreshState(),
topAppBarScrollBehavior = (scrollBehavior as? MiuixGlassScrollBehavior)?.miuixBehavior,
refreshTexts = listOf(
stringResource(R.string.pull_to_refresh),
stringResource(R.string.release_to_refresh),
@@ -69,22 +74,31 @@ fun AppPullToRefresh(
}
} else {
val state = rememberPullToRefreshState()
val actualEnabled = enabled && (
isRefreshing ||
state.distanceFraction > 0f ||
scrollBehavior == null ||
if (scrollBehavior is M3GlassScrollBehavior) {
val appbarState = scrollBehavior.m3Behavior.state
(appbarState.heightOffsetLimit == 0f || appbarState.heightOffset >= 0f) && appbarState.contentOffset >= 0f
} else {
scrollBehavior.collapsedFraction <= 0f
}
)
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = onRefresh,
modifier = modifier,
state = state,
enabled = enabled,
enabled = actualEnabled,
indicator = {
if (enabled) {
PullToRefreshDefaults.LoadingIndicator(
state = state,
isRefreshing = isRefreshing,
modifier = Modifier
.padding(top = topPadding)
.align(Alignment.TopCenter),
)
}
PullToRefreshDefaults.LoadingIndicator(
state = state,
isRefreshing = isRefreshing,
modifier = Modifier
.padding(top = topPadding)
.align(Alignment.TopCenter),
)
}
) {
content()
@@ -75,10 +75,10 @@ fun <T> ListScaffold(
},
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
scrollBehavior: GlassTopAppBarScrollBehavior? = null,
content: @Composable (PaddingValues) -> Unit
) {
val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
val scrollBehavior = scrollBehavior ?: GlassTopAppBarDefaults.defaultScrollBehavior()
AppScaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
snackbarHost = {
@@ -16,6 +16,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarColors
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.lerp
@@ -187,11 +188,14 @@ object GlassTopAppBarDefaults {
val composeEngine = ThemeConfig.composeEngine
return if (ThemeResolver.isMiuixEngine(composeEngine)) {
MiuixGlassScrollBehavior(MiuixScrollBehavior())
val miuixBehavior = MiuixScrollBehavior()
remember(miuixBehavior) { MiuixGlassScrollBehavior(miuixBehavior) }
} else if (ThemeConfig.useFlexibleTopAppBar) {
M3GlassScrollBehavior(TopAppBarDefaults.exitUntilCollapsedScrollBehavior())
val m3Behavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
remember(m3Behavior) { M3GlassScrollBehavior(m3Behavior) }
} else {
M3GlassScrollBehavior(TopAppBarDefaults.pinnedScrollBehavior())
val m3Behavior = TopAppBarDefaults.pinnedScrollBehavior()
remember(m3Behavior) { M3GlassScrollBehavior(m3Behavior) }
}
}