11package com.commandiron.wheel_picker_compose
22
33import androidx.compose.foundation.BorderStroke
4+ import androidx.compose.foundation.border
45import androidx.compose.foundation.layout.*
56import androidx.compose.foundation.lazy.LazyColumn
67import androidx.compose.foundation.lazy.LazyListState
78import androidx.compose.foundation.lazy.rememberLazyListState
89import androidx.compose.foundation.shape.RoundedCornerShape
9- import androidx.compose.material3.*
10- import androidx.compose.runtime.*
10+ import androidx.compose.material3.MaterialTheme
11+ import androidx.compose.material3.Surface
12+ import androidx.compose.runtime.Composable
13+ import androidx.compose.runtime.LaunchedEffect
1114import androidx.compose.ui.Alignment
1215import androidx.compose.ui.Modifier
1316import androidx.compose.ui.graphics.Color
1417import androidx.compose.ui.graphics.Shape
1518import androidx.compose.ui.unit.DpSize
1619import androidx.compose.ui.unit.dp
17- import dev.chrisbanes.snapper.*
20+ import dev.chrisbanes.snapper.SnapperLayoutInfo
21+ import dev.chrisbanes.snapper.rememberLazyListSnapperLayoutInfo
22+ import dev.chrisbanes.snapper.rememberSnapperFlingBehavior
1823
1924@Composable
2025fun WheelPicker (
@@ -27,23 +32,18 @@ fun WheelPicker(
2732 selectorColor : Color = MaterialTheme .colorScheme.primary.copy(alpha = 0.2f),
2833 selectorBorder : BorderStroke ? = BorderStroke (1.dp, MaterialTheme .colorScheme.primary),
2934 onScrollFinished : (snappedIndex: Int ) -> Int? = { null },
30- content : @Composable BoxScope .(index: Int , snappedIndex: Int ) -> Unit ,
35+ content : @Composable BoxScope .(index: Int ) -> Unit ,
3136) {
32- var snappedIndex by remember { mutableStateOf(0 ) }
33- val lazyListState = rememberLazyListState(
34- initialFirstVisibleItemIndex = startIndex
35- )
36- val snapperFlingBehavior = rememberSnapperFlingBehavior(
37- lazyListState = lazyListState,
38- snapIndex = {
39- snapperLayoutInfo: SnapperLayoutInfo ,
40- snappedStartIndex: Int ,
41- snappedTargetIndex: Int ->
37+ val lazyListState = rememberLazyListState(startIndex)
38+ val snapperLayoutInfo = rememberLazyListSnapperLayoutInfo(lazyListState = lazyListState)
39+ val isScrollInProgress = lazyListState.isScrollInProgress
4240
43- snappedIndex = snappedTargetIndex
44- snappedTargetIndex
41+ LaunchedEffect (isScrollInProgress) {
42+ if (! isScrollInProgress) {
43+ onScrollFinished(calculateSelectedItem(snapperLayoutInfo)? : startIndex)
4544 }
46- )
45+ }
46+
4747 Box (
4848 modifier = modifier,
4949 contentAlignment = Alignment .Center
@@ -60,10 +60,12 @@ fun WheelPicker(
6060 LazyColumn (
6161 modifier = Modifier
6262 .height(size.height)
63- .width(size.width),
63+ .width(size.width).border( 1 .dp, Color . Red ) ,
6464 state = lazyListState,
6565 contentPadding = PaddingValues (vertical = size.height / 3 ),
66- flingBehavior = snapperFlingBehavior
66+ flingBehavior = rememberSnapperFlingBehavior(
67+ lazyListState = lazyListState
68+ )
6769 ){
6870 items(count){ index ->
6971 Box (
@@ -72,9 +74,16 @@ fun WheelPicker(
7274 .width(size.width),
7375 contentAlignment = Alignment .Center
7476 ) {
75- content(index, lazyListState.layoutInfo. )
77+ content(index)
7678 }
7779 }
7880 }
7981 }
82+ }
83+
84+ private fun calculateSelectedItem (snapperLayoutInfo : SnapperLayoutInfo ): Int? {
85+ val currentItemIndex = snapperLayoutInfo.currentItem?.index
86+ return if (currentItemIndex != null ) {
87+ if (snapperLayoutInfo.currentItem?.offset != 0 ) currentItemIndex + 1 else currentItemIndex
88+ } else null
8089}
0 commit comments