From 3a5d601fd202ad733835daf627c9918d2a934958 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Sat, 15 Jul 2023 23:11:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=87=92=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/ui/page/main/MainPage.kt | 4 +- .../post/ui/page/main/explore/ExplorePage.kt | 4 +- .../main/notifications/NotificationsPage.kt | 4 +- .../tieba/post/ui/widgets/compose/LazyLoad.kt | 85 ++++++++++++++++++- 4 files changed, 89 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt index fdf61a60..bb70a78b 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/MainPage.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.Scaffold import androidx.compose.material.icons.Icons @@ -46,6 +45,7 @@ import com.huanchengfly.tieba.post.ui.page.main.user.UserPage import com.huanchengfly.tieba.post.ui.utils.DevicePosture import com.huanchengfly.tieba.post.ui.utils.MainNavigationContentPosition import com.huanchengfly.tieba.post.ui.utils.MainNavigationType +import com.huanchengfly.tieba.post.ui.widgets.compose.LazyLoadHorizontalPager import com.huanchengfly.tieba.post.utils.appPreferences import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -245,7 +245,7 @@ fun MainPage( } } ) { paddingValues -> - HorizontalPager( + LazyLoadHorizontalPager( contentPadding = paddingValues, pageCount = navigationItems.size, state = pagerState, diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/explore/ExplorePage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/explore/ExplorePage.kt index caa78535..016614e2 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/explore/ExplorePage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/explore/ExplorePage.kt @@ -3,7 +3,6 @@ package com.huanchengfly.tieba.post.ui.page.main.explore import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.width -import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.Scaffold import androidx.compose.material.Tab @@ -30,6 +29,7 @@ import com.huanchengfly.tieba.post.ui.page.main.explore.concern.ConcernPage import com.huanchengfly.tieba.post.ui.page.main.explore.hot.HotPage import com.huanchengfly.tieba.post.ui.page.main.explore.personalized.PersonalizedPage import com.huanchengfly.tieba.post.ui.widgets.compose.ActionItem +import com.huanchengfly.tieba.post.ui.widgets.compose.LazyLoadHorizontalPager import com.huanchengfly.tieba.post.ui.widgets.compose.PagerTabIndicator import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact @@ -125,7 +125,7 @@ fun ExplorePage( }, modifier = Modifier.fillMaxSize(), ) { paddingValues -> - HorizontalPager( + LazyLoadHorizontalPager( contentPadding = paddingValues, pageCount = pages.size, state = pagerState, diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/notifications/NotificationsPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/notifications/NotificationsPage.kt index 9b041405..4debeaf1 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/notifications/NotificationsPage.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/main/notifications/NotificationsPage.kt @@ -2,7 +2,6 @@ package com.huanchengfly.tieba.post.ui.page.main.notifications import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.Scaffold import androidx.compose.material.Tab @@ -24,6 +23,7 @@ import com.huanchengfly.tieba.post.ui.common.theme.compose.ExtendedTheme import com.huanchengfly.tieba.post.ui.page.main.notifications.list.NotificationsListPage import com.huanchengfly.tieba.post.ui.page.main.notifications.list.NotificationsType import com.huanchengfly.tieba.post.ui.widgets.compose.ActionItem +import com.huanchengfly.tieba.post.ui.widgets.compose.LazyLoadHorizontalPager import com.huanchengfly.tieba.post.ui.widgets.compose.PagerTabIndicator import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact @@ -86,7 +86,7 @@ fun NotificationsPage() { }, modifier = Modifier.fillMaxSize(), ) { paddingValues -> - HorizontalPager( + LazyLoadHorizontalPager( contentPadding = paddingValues, pageCount = pages.size, state = pagerState, diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LazyLoad.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LazyLoad.kt index 32ace9f5..653be87f 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LazyLoad.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LazyLoad.kt @@ -1,14 +1,95 @@ package com.huanchengfly.tieba.post.ui.widgets.compose +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.snapping.SnapFlingBehavior +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PageSize +import androidx.compose.foundation.pager.PagerDefaults +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +val LocalShouldLoad = compositionLocalOf { true } @Composable fun LazyLoad( loaded: Boolean, onLoad: () -> Unit, ) { - LaunchedEffect(key1 = loaded, key2 = onLoad) { - if (!loaded) onLoad() + val shouldLoad = LocalShouldLoad.current + LaunchedEffect(loaded, shouldLoad, onLoad) { + if (!loaded && shouldLoad) onLoad() + } +} + +@Composable +fun ProvideShouldLoad( + shouldLoad: Boolean, + content: @Composable () -> Unit +) { + val currentShouldLoad = LocalShouldLoad.current + + val localShouldLoad = remember(currentShouldLoad, shouldLoad) { + currentShouldLoad && shouldLoad + } + + CompositionLocalProvider( + LocalShouldLoad provides localShouldLoad + ) { + content() + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun LazyLoadHorizontalPager( + pageCount: Int, + modifier: Modifier = Modifier, + state: PagerState = rememberPagerState(), + contentPadding: PaddingValues = PaddingValues(0.dp), + pageSize: PageSize = PageSize.Fill, + beyondBoundsPageCount: Int = 0, + pageSpacing: Dp = 0.dp, + verticalAlignment: Alignment.Vertical = Alignment.CenterVertically, + flingBehavior: SnapFlingBehavior = PagerDefaults.flingBehavior(state = state), + userScrollEnabled: Boolean = true, + reverseLayout: Boolean = false, + key: ((index: Int) -> Any)? = null, + pageNestedScrollConnection: NestedScrollConnection = PagerDefaults.pageNestedScrollConnection( + Orientation.Horizontal + ), + pageContent: @Composable (page: Int) -> Unit +) { + HorizontalPager( + pageCount = pageCount, + state = state, + modifier = modifier, + contentPadding = contentPadding, + pageSize = pageSize, + beyondBoundsPageCount = beyondBoundsPageCount, + pageSpacing = pageSpacing, + verticalAlignment = verticalAlignment, + flingBehavior = flingBehavior, + userScrollEnabled = userScrollEnabled, + reverseLayout = reverseLayout, + key = key, + pageNestedScrollConnection = pageNestedScrollConnection + ) { + ProvideShouldLoad( + shouldLoad = it == state.currentPage + ) { + pageContent(it) + } } } \ No newline at end of file