feat: 懒加载
This commit is contained in:
parent
6bf8a231f1
commit
3a5d601fd2
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue