@@ -56,18 +56,14 @@ import androidx.compose.ui.platform.LocalHapticFeedback
5656import androidx.compose.ui.text.TextStyle
5757import androidx.compose.ui.text.font.FontWeight
5858import androidx.compose.ui.unit.Dp
59+ import androidx.compose.ui.unit.Velocity
5960import androidx.compose.ui.unit.dp
6061import androidx.compose.ui.unit.sp
6162import kotlinx.coroutines.CoroutineScope
6263import kotlinx.coroutines.flow.collectLatest
6364import kotlinx.coroutines.launch
64- import top.yukonga.miuix.kmp.utils.LocalOverScrollState
65- import top.yukonga.miuix.kmp.utils.LocalScrollCoordinatorState
66- import top.yukonga.miuix.kmp.utils.OverScrollState
67- import top.yukonga.miuix.kmp.utils.ScrollPriority
6865import top.yukonga.miuix.kmp.utils.getWindowSize
6966import top.yukonga.miuix.kmp.utils.overScrollVertical
70- import top.yukonga.miuix.kmp.utils.rememberScrollCoordinator
7167import kotlin.math.PI
7268import kotlin.math.cos
7369import kotlin.math.max
@@ -87,7 +83,6 @@ import kotlin.math.sin
8783 * @param refreshTexts The texts to show when refreshing.
8884 * @param refreshTextStyle The style of the refresh text.
8985 * @param topAppBarScrollBehavior The scroll behavior of the top app bar to coordinate with.
90- * @param useScrollCoordinator Whether to use the scroll coordinator for better integration.
9186 * @param onRefresh The callback to be called when the refresh is triggered.
9287 * @param content the content to be shown when the [PullToRefresh] is expanded.
9388 */
@@ -101,7 +96,6 @@ fun PullToRefresh(
10196 refreshTexts : List <String > = PullToRefreshDefaults .refreshTexts,
10297 refreshTextStyle : TextStyle = PullToRefreshDefaults .refreshTextStyle,
10398 topAppBarScrollBehavior : ScrollBehavior ? = null,
104- useScrollCoordinator : Boolean = false,
10599 onRefresh : () -> Unit = {},
106100 content : @Composable () -> Unit
107101) {
@@ -111,19 +105,38 @@ fun PullToRefresh(
111105 pullToRefreshState.syncDragOffsetWithRawOffset()
112106 }
113107
114- val overScrollState = LocalOverScrollState .current
108+ val nestedScrollConnection = remember(pullToRefreshState, topAppBarScrollBehavior) {
109+ object : NestedScrollConnection {
110+ override fun onPreScroll (available : Offset , source : NestedScrollSource ): Offset {
111+ val consumedByAppBar = topAppBarScrollBehavior?.nestedScrollConnection?.onPreScroll(available, source) ? : Offset .Zero
115112
116- val scrollCoordinator = if (useScrollCoordinator && topAppBarScrollBehavior != null ) {
117- rememberScrollCoordinator(
118- topAppBarScrollBehavior = topAppBarScrollBehavior,
119- pullToRefreshState = pullToRefreshState,
120- overScrollState = overScrollState
121- )
122- } else null
113+ val remaining = available - consumedByAppBar
114+ val consumedByRefresh = pullToRefreshState.createNestedScrollConnection().onPreScroll(remaining, source)
115+
116+ return consumedByAppBar + consumedByRefresh
117+ }
118+
119+ override fun onPostScroll (consumed : Offset , available : Offset , source : NestedScrollSource ): Offset {
120+ val consumedByAppBar = topAppBarScrollBehavior?.nestedScrollConnection?.onPostScroll(consumed, available, source) ? : Offset .Zero
121+
122+ val remaining = available - consumedByAppBar
123+ val consumedByRefresh = pullToRefreshState.createNestedScrollConnection().onPostScroll(consumed, remaining, source)
124+
125+ return consumedByAppBar + consumedByRefresh
126+ }
127+
128+ override suspend fun onPreFling (available : Velocity ): Velocity {
129+ return topAppBarScrollBehavior?.nestedScrollConnection?.onPreFling(available) ? : Velocity .Zero
130+ }
123131
124- val nestedScrollConnection = remember(pullToRefreshState, overScrollState, scrollCoordinator) {
125- scrollCoordinator ? : pullToRefreshState.createNestedScrollConnection(overScrollState)
132+ override suspend fun onPostFling (consumed : Velocity , available : Velocity ): Velocity {
133+ val consumedByAppBar = topAppBarScrollBehavior?.nestedScrollConnection?.onPostFling(consumed, available) ? : Velocity .Zero
134+
135+ return consumedByAppBar
136+ }
137+ }
126138 }
139+
127140 val pointerModifier = Modifier .pointerInput(Unit ) {
128141 awaitPointerEventScope {
129142 while (true ) {
@@ -142,18 +155,12 @@ fun PullToRefresh(
142155
143156 CompositionLocalProvider (
144157 LocalPullToRefreshState provides pullToRefreshState,
145- LocalScrollCoordinatorState provides scrollCoordinator?.state
146158 ) {
147159 val boxModifier = modifier
148160 .nestedScroll(nestedScrollConnection)
149161 .then(pointerModifier)
150- .then(
151- if (scrollCoordinator != null && scrollCoordinator.state.currentPriority == ScrollPriority .OverScroll ) {
152- Modifier .overScrollVertical()
153- } else {
154- Modifier
155- }
156- )
162+ .overScrollVertical()
163+
157164 Box (modifier = boxModifier) {
158165 Column {
159166 RefreshHeader (
@@ -646,11 +653,8 @@ class PullToRefreshState(
646653 isRefreshingInProgress = false
647654 }
648655
649- fun createNestedScrollConnection (
650- overScrollState : OverScrollState
651- ): NestedScrollConnection = object : NestedScrollConnection {
656+ fun createNestedScrollConnection (): NestedScrollConnection = object : NestedScrollConnection {
652657 override fun onPreScroll (available : Offset , source : NestedScrollSource ): Offset {
653- if (overScrollState.isOverScrollActive) return Offset .Zero
654658 if (isRefreshingInProgress || refreshState == RefreshState .Refreshing || refreshState == RefreshState .RefreshComplete ) return Offset .Zero
655659 return if (source == NestedScrollSource .UserInput && available.y < 0 && rawDragOffset > 0f ) {
656660 if (isRebounding && dragOffsetAnimatable.isRunning) {
@@ -665,7 +669,7 @@ class PullToRefreshState(
665669 }
666670
667671 override fun onPostScroll (consumed : Offset , available : Offset , source : NestedScrollSource ): Offset = when {
668- overScrollState.isOverScrollActive || isRefreshingInProgress || refreshState == RefreshState .Refreshing || refreshState == RefreshState .RefreshComplete -> Offset .Zero
672+ isRefreshingInProgress || refreshState == RefreshState .Refreshing || refreshState == RefreshState .RefreshComplete -> Offset .Zero
669673 source == NestedScrollSource .UserInput -> {
670674 if (available.y > 0f && consumed.y == 0f ) {
671675 if (isRebounding && dragOffsetAnimatable.isRunning) {
0 commit comments