feat: 懒加载

This commit is contained in:
HuanCheng65 2023-07-15 23:11:15 +08:00
parent 6bf8a231f1
commit 3a5d601fd2
No known key found for this signature in database
GPG Key ID: 5EC9DD60A32C7360
4 changed files with 89 additions and 8 deletions

View File

@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.material.icons.Icons 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.DevicePosture
import com.huanchengfly.tieba.post.ui.utils.MainNavigationContentPosition import com.huanchengfly.tieba.post.ui.utils.MainNavigationContentPosition
import com.huanchengfly.tieba.post.ui.utils.MainNavigationType 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.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
@ -245,7 +245,7 @@ fun MainPage(
} }
} }
) { paddingValues -> ) { paddingValues ->
HorizontalPager( LazyLoadHorizontalPager(
contentPadding = paddingValues, contentPadding = paddingValues,
pageCount = navigationItems.size, pageCount = navigationItems.size,
state = pagerState, state = pagerState,

View File

@ -3,7 +3,6 @@ package com.huanchengfly.tieba.post.ui.page.main.explore
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.material.Tab 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.hot.HotPage
import com.huanchengfly.tieba.post.ui.page.main.explore.personalized.PersonalizedPage 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.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.PagerTabIndicator
import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar
import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact
@ -125,7 +125,7 @@ fun ExplorePage(
}, },
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { paddingValues -> ) { paddingValues ->
HorizontalPager( LazyLoadHorizontalPager(
contentPadding = paddingValues, contentPadding = paddingValues,
pageCount = pages.size, pageCount = pages.size,
state = pagerState, state = pagerState,

View File

@ -2,7 +2,6 @@ package com.huanchengfly.tieba.post.ui.page.main.notifications
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.material.Tab 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.NotificationsListPage
import com.huanchengfly.tieba.post.ui.page.main.notifications.list.NotificationsType 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.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.PagerTabIndicator
import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar import com.huanchengfly.tieba.post.ui.widgets.compose.Toolbar
import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact import com.huanchengfly.tieba.post.ui.widgets.compose.accountNavIconIfCompact
@ -86,7 +86,7 @@ fun NotificationsPage() {
}, },
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { paddingValues -> ) { paddingValues ->
HorizontalPager( LazyLoadHorizontalPager(
contentPadding = paddingValues, contentPadding = paddingValues,
pageCount = pages.size, pageCount = pages.size,
state = pagerState, state = pagerState,

View File

@ -1,14 +1,95 @@
package com.huanchengfly.tieba.post.ui.widgets.compose 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.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect 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 @Composable
fun LazyLoad( fun LazyLoad(
loaded: Boolean, loaded: Boolean,
onLoad: () -> Unit, onLoad: () -> Unit,
) { ) {
LaunchedEffect(key1 = loaded, key2 = onLoad) { val shouldLoad = LocalShouldLoad.current
if (!loaded) onLoad() 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)
}
} }
} }