From 11a3665732ee28f992541b7c40a2a324eb5cab0e Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Fri, 21 Jul 2023 22:19:23 +0800 Subject: [PATCH] =?UTF-8?q?pref(LoadMore.kt):=20=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/ui/widgets/compose/LoadMore.kt | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LoadMore.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LoadMore.kt index f90143fd..4c536328 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LoadMore.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/LoadMore.kt @@ -7,6 +7,11 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -21,6 +26,7 @@ import androidx.compose.ui.unit.dp import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.ui.common.theme.compose.ExtendedTheme import com.huanchengfly.tieba.post.ui.common.theme.compose.loadMoreIndicator +import kotlin.math.abs import kotlin.math.roundToInt private val LoadDistance = 70.dp @@ -43,16 +49,25 @@ fun LoadMoreLayout( ) { val loadDistance = with(LocalDensity.current) { LoadDistance.toPx() } - val canLoadMore = (enableLoadMore && !loadEnd) + var waitingStateReset by remember { mutableStateOf(false) } - val swipeableState = if (canLoadMore) { - rememberSwipeableState(isLoading) { newValue -> - if (newValue && !isLoading) onLoadMore() + val curIsLoading by rememberUpdatedState(newValue = isLoading) + val canLoadMore = remember(enableLoadMore, loadEnd) { enableLoadMore && !loadEnd } + val curCanLoadMore by rememberUpdatedState(newValue = canLoadMore) + val swipeableState = rememberSwipeableState(false) { newValue -> + if (newValue && !curIsLoading && curCanLoadMore) { + onLoadMore() + waitingStateReset = true true - } - } else { - rememberSwipeableState(false) + } else !newValue } + val stateOffset by swipeableState.offset + LaunchedEffect(stateOffset) { + if (waitingStateReset && abs(stateOffset - loadDistance) < 1f) { + waitingStateReset = false + } + } + Box( modifier = Modifier @@ -65,7 +80,7 @@ fun LoadMoreLayout( ), thresholds = { _, _ -> FractionalThreshold(0.5f) }, orientation = Orientation.Vertical, - enabled = enableLoadMore, + enabled = enableLoadMore && !swipeableState.isAnimationRunning && !waitingStateReset, ) .fillMaxSize() ) {