Skip to content

Commit e7eade5

Browse files
authored
Merge pull request #962 from arkivanov/expose-PagerState
Add ChildPages composable functions exposing PagerState
2 parents 0b455cf + 49e4c2c commit e7eade5

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

extensions-compose/api/android/extensions-compose.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ public final class com/arkivanov/decompose/extensions/compose/lazyitems/ChildIte
99

1010
public final class com/arkivanov/decompose/extensions/compose/pages/ChildPagesKt {
1111
public static final fun ChildPages (Lcom/arkivanov/decompose/router/pages/ChildPages;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function5;Landroidx/compose/runtime/Composer;II)V
12+
public static final fun ChildPages (Lcom/arkivanov/decompose/router/pages/ChildPages;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V
1213
public static final fun ChildPages (Lcom/arkivanov/decompose/value/Value;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function5;Landroidx/compose/runtime/Composer;II)V
14+
public static final fun ChildPages (Lcom/arkivanov/decompose/value/Value;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V
1315
public static final fun defaultHorizontalPager ()Lkotlin/jvm/functions/Function6;
1416
public static final fun defaultVerticalPager ()Lkotlin/jvm/functions/Function6;
1517
}

extensions-compose/api/extensions-compose.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ final val com.arkivanov.decompose.extensions.compose.stack.animation/isFront //
8989

9090
final fun (com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimator).com.arkivanov.decompose.extensions.compose.stack.animation/plus(com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimator): com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimator // com.arkivanov.decompose.extensions.compose.stack.animation/plus|plus@com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimator(com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimator){}[0]
9191
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.pages/ChildPages(com.arkivanov.decompose.router.pages/ChildPages<#A, #B>, kotlin/Function1<kotlin/Int, kotlin/Unit>, androidx.compose.ui/Modifier?, com.arkivanov.decompose.extensions.compose.pages/PagesScrollAnimation?, kotlin/Function6<androidx.compose.ui/Modifier, androidx.compose.foundation.pager/PagerState, kotlin/Function1<kotlin/Int, kotlin/Any>, kotlin/Function4<androidx.compose.foundation.pager/PagerScope, kotlin/Int, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>?, kotlin/Function1<com.arkivanov.decompose/Child<#A, #B>, kotlin/Any>?, kotlin/Function5<androidx.compose.foundation.pager/PagerScope, kotlin/Int, #B, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.arkivanov.decompose.extensions.compose.pages/ChildPages|ChildPages(com.arkivanov.decompose.router.pages.ChildPages<0:0,0:1>;kotlin.Function1<kotlin.Int,kotlin.Unit>;androidx.compose.ui.Modifier?;com.arkivanov.decompose.extensions.compose.pages.PagesScrollAnimation?;kotlin.Function6<androidx.compose.ui.Modifier,androidx.compose.foundation.pager.PagerState,kotlin.Function1<kotlin.Int,kotlin.Any>,kotlin.Function4<androidx.compose.foundation.pager.PagerScope,kotlin.Int,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>?;kotlin.Function1<com.arkivanov.decompose.Child<0:0,0:1>,kotlin.Any>?;kotlin.Function5<androidx.compose.foundation.pager.PagerScope,kotlin.Int,0:1,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§<kotlin.Any>;1§<kotlin.Any>}[0]
92+
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.pages/ChildPages(com.arkivanov.decompose.router.pages/ChildPages<#A, #B>, kotlin/Function1<kotlin/Int, kotlin/Unit>, androidx.compose.ui/Modifier?, com.arkivanov.decompose.extensions.compose.pages/PagesScrollAnimation?, kotlin/Function6<androidx.compose.ui/Modifier, androidx.compose.foundation.pager/PagerState, kotlin/Function1<kotlin/Int, kotlin/Any>, kotlin/Function4<androidx.compose.foundation.pager/PagerScope, kotlin/Int, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>?, kotlin/Function1<com.arkivanov.decompose/Child<#A, #B>, kotlin/Any>?, kotlin/Function6<androidx.compose.foundation.pager/PagerScope, kotlin/Int, #B, androidx.compose.foundation.pager/PagerState, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.arkivanov.decompose.extensions.compose.pages/ChildPages|ChildPages(com.arkivanov.decompose.router.pages.ChildPages<0:0,0:1>;kotlin.Function1<kotlin.Int,kotlin.Unit>;androidx.compose.ui.Modifier?;com.arkivanov.decompose.extensions.compose.pages.PagesScrollAnimation?;kotlin.Function6<androidx.compose.ui.Modifier,androidx.compose.foundation.pager.PagerState,kotlin.Function1<kotlin.Int,kotlin.Any>,kotlin.Function4<androidx.compose.foundation.pager.PagerScope,kotlin.Int,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>?;kotlin.Function1<com.arkivanov.decompose.Child<0:0,0:1>,kotlin.Any>?;kotlin.Function6<androidx.compose.foundation.pager.PagerScope,kotlin.Int,0:1,androidx.compose.foundation.pager.PagerState,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§<kotlin.Any>;1§<kotlin.Any>}[0]
9293
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.pages/ChildPages(com.arkivanov.decompose.value/Value<com.arkivanov.decompose.router.pages/ChildPages<#A, #B>>, kotlin/Function1<kotlin/Int, kotlin/Unit>, androidx.compose.ui/Modifier?, com.arkivanov.decompose.extensions.compose.pages/PagesScrollAnimation?, kotlin/Function6<androidx.compose.ui/Modifier, androidx.compose.foundation.pager/PagerState, kotlin/Function1<kotlin/Int, kotlin/Any>, kotlin/Function4<androidx.compose.foundation.pager/PagerScope, kotlin/Int, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>?, kotlin/Function1<com.arkivanov.decompose/Child<#A, #B>, kotlin/Any>?, kotlin/Function5<androidx.compose.foundation.pager/PagerScope, kotlin/Int, #B, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.arkivanov.decompose.extensions.compose.pages/ChildPages|ChildPages(com.arkivanov.decompose.value.Value<com.arkivanov.decompose.router.pages.ChildPages<0:0,0:1>>;kotlin.Function1<kotlin.Int,kotlin.Unit>;androidx.compose.ui.Modifier?;com.arkivanov.decompose.extensions.compose.pages.PagesScrollAnimation?;kotlin.Function6<androidx.compose.ui.Modifier,androidx.compose.foundation.pager.PagerState,kotlin.Function1<kotlin.Int,kotlin.Any>,kotlin.Function4<androidx.compose.foundation.pager.PagerScope,kotlin.Int,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>?;kotlin.Function1<com.arkivanov.decompose.Child<0:0,0:1>,kotlin.Any>?;kotlin.Function5<androidx.compose.foundation.pager.PagerScope,kotlin.Int,0:1,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§<kotlin.Any>;1§<kotlin.Any>}[0]
94+
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.pages/ChildPages(com.arkivanov.decompose.value/Value<com.arkivanov.decompose.router.pages/ChildPages<#A, #B>>, kotlin/Function1<kotlin/Int, kotlin/Unit>, androidx.compose.ui/Modifier?, com.arkivanov.decompose.extensions.compose.pages/PagesScrollAnimation?, kotlin/Function6<androidx.compose.ui/Modifier, androidx.compose.foundation.pager/PagerState, kotlin/Function1<kotlin/Int, kotlin/Any>, kotlin/Function4<androidx.compose.foundation.pager/PagerScope, kotlin/Int, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>?, kotlin/Function1<com.arkivanov.decompose/Child<#A, #B>, kotlin/Any>?, kotlin/Function6<androidx.compose.foundation.pager/PagerScope, kotlin/Int, #B, androidx.compose.foundation.pager/PagerState, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.arkivanov.decompose.extensions.compose.pages/ChildPages|ChildPages(com.arkivanov.decompose.value.Value<com.arkivanov.decompose.router.pages.ChildPages<0:0,0:1>>;kotlin.Function1<kotlin.Int,kotlin.Unit>;androidx.compose.ui.Modifier?;com.arkivanov.decompose.extensions.compose.pages.PagesScrollAnimation?;kotlin.Function6<androidx.compose.ui.Modifier,androidx.compose.foundation.pager.PagerState,kotlin.Function1<kotlin.Int,kotlin.Any>,kotlin.Function4<androidx.compose.foundation.pager.PagerScope,kotlin.Int,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>?;kotlin.Function1<com.arkivanov.decompose.Child<0:0,0:1>,kotlin.Any>?;kotlin.Function6<androidx.compose.foundation.pager.PagerScope,kotlin.Int,0:1,androidx.compose.foundation.pager.PagerState,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§<kotlin.Any>;1§<kotlin.Any>}[0]
9395
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback/predictiveBackAnimation(com.arkivanov.essenty.backhandler/BackHandler, com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimation<#A, #B>? = ..., kotlin/Function3<com.arkivanov.essenty.backhandler/BackEvent, com.arkivanov.decompose/Child.Created<#A, #B>, com.arkivanov.decompose/Child.Created<#A, #B>, com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback/PredictiveBackAnimatable> = ..., kotlin/Function0<kotlin/Unit>): com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimation<#A, #B> // com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback/predictiveBackAnimation|predictiveBackAnimation(com.arkivanov.essenty.backhandler.BackHandler;com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimation<0:0,0:1>?;kotlin.Function3<com.arkivanov.essenty.backhandler.BackEvent,com.arkivanov.decompose.Child.Created<0:0,0:1>,com.arkivanov.decompose.Child.Created<0:0,0:1>,com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.PredictiveBackAnimatable>;kotlin.Function0<kotlin.Unit>){0§<kotlin.Any>;1§<kotlin.Any>}[0]
9496
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.stack.animation/stackAnimation(com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimator = ..., kotlin/Boolean = ...): com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimation<#A, #B> // com.arkivanov.decompose.extensions.compose.stack.animation/stackAnimation|stackAnimation(com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimator;kotlin.Boolean){0§<kotlin.Any>;1§<kotlin.Any>}[0]
9597
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.stack.animation/stackAnimation(kotlin/Boolean = ..., kotlin/Function1<com.arkivanov.decompose/Child.Created<#A, #B>, com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimator?>): com.arkivanov.decompose.extensions.compose.stack.animation/StackAnimation<#A, #B> // com.arkivanov.decompose.extensions.compose.stack.animation/stackAnimation|stackAnimation(kotlin.Boolean;kotlin.Function1<com.arkivanov.decompose.Child.Created<0:0,0:1>,com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimator?>){0§<kotlin.Any>;1§<kotlin.Any>}[0]

extensions-compose/api/jvm/extensions-compose.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public final class com/arkivanov/decompose/extensions/compose/lifecycle/Lifecycl
1313

1414
public final class com/arkivanov/decompose/extensions/compose/pages/ChildPagesKt {
1515
public static final fun ChildPages (Lcom/arkivanov/decompose/router/pages/ChildPages;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function5;Landroidx/compose/runtime/Composer;II)V
16+
public static final fun ChildPages (Lcom/arkivanov/decompose/router/pages/ChildPages;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V
1617
public static final fun ChildPages (Lcom/arkivanov/decompose/value/Value;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function5;Landroidx/compose/runtime/Composer;II)V
18+
public static final fun ChildPages (Lcom/arkivanov/decompose/value/Value;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lcom/arkivanov/decompose/extensions/compose/pages/PagesScrollAnimation;Lkotlin/jvm/functions/Function6;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function6;Landroidx/compose/runtime/Composer;II)V
1719
public static final fun defaultHorizontalPager ()Lkotlin/jvm/functions/Function6;
1820
public static final fun defaultVerticalPager ()Lkotlin/jvm/functions/Function6;
1921
}

extensions-compose/src/commonMain/kotlin/com/arkivanov/decompose/extensions/compose/pages/ChildPages.kt

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.runtime.remember
1212
import androidx.compose.runtime.rememberUpdatedState
1313
import androidx.compose.ui.Modifier
1414
import com.arkivanov.decompose.Child
15+
import com.arkivanov.decompose.ExperimentalDecomposeApi
1516
import com.arkivanov.decompose.Ref
1617
import com.arkivanov.decompose.extensions.compose.subscribeAsState
1718
import com.arkivanov.decompose.router.pages.ChildPages
@@ -29,6 +30,31 @@ fun <C : Any, T : Any> ChildPages(
2930
pager: ChildPagesPager = defaultHorizontalPager(),
3031
key: (Child<C, T>) -> Any = Child<*, *>::key,
3132
pageContent: @Composable PagerScope.(index: Int, page: T) -> Unit,
33+
) {
34+
ChildPages(
35+
pages = pages,
36+
onPageSelected = onPageSelected,
37+
modifier = modifier,
38+
scrollAnimation = scrollAnimation,
39+
pager = pager,
40+
key = key,
41+
pageContent = { index, page, _ -> pageContent(index, page) },
42+
)
43+
}
44+
45+
/**
46+
* Displays a list of pages represented by [ChildPages].
47+
*/
48+
@ExperimentalDecomposeApi
49+
@Composable
50+
fun <C : Any, T : Any> ChildPages(
51+
pages: Value<ChildPages<C, T>>,
52+
onPageSelected: (index: Int) -> Unit,
53+
modifier: Modifier = Modifier,
54+
scrollAnimation: PagesScrollAnimation = PagesScrollAnimation.Disabled,
55+
pager: ChildPagesPager = defaultHorizontalPager(),
56+
key: (Child<C, T>) -> Any = Child<*, *>::keyHashString,
57+
pageContent: @Composable PagerScope.(index: Int, page: T, PagerState) -> Unit,
3258
) {
3359
val state by pages.subscribeAsState()
3460

@@ -55,6 +81,31 @@ fun <C : Any, T : Any> ChildPages(
5581
pager: ChildPagesPager = defaultHorizontalPager(),
5682
key: (Child<C, T>) -> Any = Child<*, *>::key,
5783
pageContent: @Composable PagerScope.(index: Int, page: T) -> Unit,
84+
) {
85+
ChildPages(
86+
pages = pages,
87+
onPageSelected = onPageSelected,
88+
modifier = modifier,
89+
scrollAnimation = scrollAnimation,
90+
pager = pager,
91+
key = key,
92+
pageContent = { index, page, _ -> pageContent(index, page) },
93+
)
94+
}
95+
96+
/**
97+
* Displays a list of pages represented by [ChildPages].
98+
*/
99+
@ExperimentalDecomposeApi
100+
@Composable
101+
fun <C : Any, T : Any> ChildPages(
102+
pages: ChildPages<C, T>,
103+
onPageSelected: (index: Int) -> Unit,
104+
modifier: Modifier = Modifier,
105+
scrollAnimation: PagesScrollAnimation = PagesScrollAnimation.Disabled,
106+
pager: ChildPagesPager = defaultHorizontalPager(),
107+
key: (Child<C, T>) -> Any = Child<*, *>::keyHashString,
108+
pageContent: @Composable PagerScope.(index: Int, page: T, PagerState) -> Unit,
58109
) {
59110
val selectedIndex = pages.selectedIndex.coerceAtLeast(0)
60111
val pageCountState = rememberUpdatedState(pages.items.size)
@@ -99,7 +150,7 @@ fun <C : Any, T : Any> ChildPages(
99150

100151
val page = pageRef.value
101152
if (page != null) {
102-
pageContent(pageIndex, page)
153+
pageContent(pageIndex, page, state)
103154
}
104155
}
105156
}

0 commit comments

Comments
 (0)