Просмотр исходного кода

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

fansan 4 месяцев назад
Родитель
Сommit
7ca241e1ae

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/explore/ExploreShowScreen.kt

@@ -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,

+ 5 - 1
app/src/main/java/io/legado/app/ui/book/import/local/ImportBookScreen.kt

@@ -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 -> {

+ 6 - 1
app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookScreen.kt

@@ -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) {

+ 2 - 1
app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt

@@ -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,

+ 2 - 1
app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfScreen.kt

@@ -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 = {

+ 1 - 0
app/src/main/java/io/legado/app/ui/main/home/HomeScreen.kt

@@ -452,6 +452,7 @@ fun HomeScreen(
             isRefreshing = homepageState.isRefreshing,
             onRefresh = onRefreshHomepage,
             modifier = Modifier.fillMaxSize(),
+            scrollBehavior = scrollBehavior,
         ) {
             BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
                 val dashboardScrollState = rememberScrollState()

+ 24 - 10
app/src/main/java/io/legado/app/ui/widget/components/AppPullToRefresh.kt

@@ -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()

+ 2 - 2
app/src/main/java/io/legado/app/ui/widget/components/list/ListScaffold.kt

@@ -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 = {

+ 7 - 3
app/src/main/java/io/legado/app/ui/widget/components/topbar/GlassMediumFlexibleTopAppBar.kt

@@ -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) }
         }
     }