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.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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue