Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何更改VerticalScroller';是否从onScrollPositionChanged回调中选择s滚动位置?_Android_Kotlin_Android Jetpack Compose - Fatal编程技术网

Android 如何更改VerticalScroller';是否从onScrollPositionChanged回调中选择s滚动位置?

Android 如何更改VerticalScroller';是否从onScrollPositionChanged回调中选择s滚动位置?,android,kotlin,android-jetpack-compose,Android,Kotlin,Android Jetpack Compose,如下面的代码所示,我有一个回调,我想在这里收集VerticalScroller的位置,但如果这样做,VerticalScrollers小部件将不再滚动,因为在VerticalScroller的源代码中,初始回调调用了VerticalScroller的scrollerPosition。无法从要使用该值的回调中访问该值。是否有一种快速方法可以调用滚动位置或使滚动行为继续?(不创建递归“竞争”条件?) 事实上我找到了解决问题的办法。。。(我有时被教导要跳出框框思考…)所以 在我的@Compose函数中

如下面的代码所示,我有一个回调,我想在这里收集
VerticalScroller
的位置,但如果这样做,VerticalScrollers小部件将不再滚动,因为在
VerticalScroller
的源代码中,初始回调调用了
VerticalScroller
scrollerPosition
。无法从要使用该值的回调中访问该值。是否有一种快速方法可以调用
滚动位置
或使滚动行为继续?(不创建递归“竞争”条件?)


事实上我找到了解决问题的办法。。。(我有时被教导要跳出框框思考…)所以

在我的
@Compose
函数中,我实际上需要创建自己的
scrollerPosition
实例,并在调用
VerticalScroller
时使用它来更改Position。我担心这可能会导致递归的“竞争”调用情况,但这取决于
滚动程序的逻辑中何时调用
onScrolledPostionChanged
。如果在
scrollerPosition.position
更改值时调用
onScrolledPositionChanged
,则可能会得到递归的“竞争”条件。但显然不是

所以我的变化基本上是这样的:

@Composable
fun StationsScreen(deviceLocation: LocationData, openDrawer: () -> Unit)
{

    var scrollPosition = ScrollPosition(0.px,0.px)

    var myScrollerPosition = +memo{ ScrollerPosition ()}  //<--- make my own scrollerPosition

    FlexColumn {
        inflexible {
            TopAppBar(
                title = {Text(text = "Stations")},
                navigationIcon = {
                    VectorImageButton(id = R.drawable.ic_baseline_menu_24) {
                        openDrawer()
                    }
                }
            )
        }
        inflexible {
            Column (
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ){

                LocationWidget(deviceLocation)
            }
        }
        inflexible {
            Column(
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ){
                PushWidget(){
                    deviceLocation.lat++
                    deviceLocation.lng++
                }
            }
        }
        inflexible{
            Column(
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ) {
                ScrollPosWidget(scrollPosition = scrollPosition)
            }
        }
        flexible(flex = 1f)
        {
            VerticalScroller (
                scrollerPosition = myScrollerPosition,
                onScrollPositionChanged = { px: Px, px1: Px ->
                    scrollPosition.posX = px
                    scrollPosition.maxX = px1
                    myScrollerPosition.value = px //<-- remember to set the new value here

                    // You can now use the difference of maxX and posX to load
                    // new items into the list...

            }){

                Column {

                    for(i in 0..20) {
                        HeightSpacer(16.dp)
                        imageBank.forEach { imageItem: ImageItem ->

                            Text(text = imageItem.title ?: "<Empty>")

                            Divider()
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun LocationWidget(locationData: LocationData){

    Surface {
        Padding(padding = 8.dp) {
            Text(text = "${locationData.lat}, ${locationData.lng}")
        }
    }

}

@Composable
fun PushWidget(action: () -> Unit){

    Surface {
        Padding(padding = 8.dp) {
            Button(text = "Click Me!", onClick = action)
        }
    }
}

@Composable
fun ScrollPosWidget(scrollPosition: ScrollPosition){
    Surface {
        Padding(padding = 8.dp) {
            Text(text = "posX=${scrollPosition.posX}, maxX=${scrollPosition.maxX}")
        }
    }
}
@Composable
趣味站屏幕(设备位置:位置数据,openDrawer:()->单元)
{
var scrollPosition=scrollPosition(0.px,0.px)
var myScrollerPosition=+memo{ScrollerPosition()}//
scrollPosition.posX=px
scrollPosition.maxX=px1
myScrollerPosition.value=px//
文本(Text=imageItem.title?:“”)
分隔器()
}
}
}
}
}
}
}
@组合的
有趣的LocationWidget(locationData:locationData){
表面{
填充(填充=8.dp){
Text(Text=“${locationData.lat},${locationData.lng}”)
}
}
}
@组合的
趣味推送小部件(动作:()->单位){
表面{
填充(填充=8.dp){
按钮(text=“Click Me!”,onClick=action)
}
}
}
@组合的
有趣的ScrollPosWidget(scrollPosition:scrollPosition){
表面{
填充(填充=8.dp){
Text(Text=“posX=${scrollPosition.posX},maxX=${scrollPosition.maxX}”)
}
}
}

RG

你能分享这个链接吗?这里有一个compose的每个UI组件的列表。@mudit_sen Thanx供评论,显然找到了一个有效的解决方案(见下面的答案),我将很快在GitHub上发布这个“实验”,并将其链接到这里。在那里,您将看到整个代码。RG@mudit_sen这是该项目的公共链接。随着我对Composable有了更多的经验,它将不断发展。布鲁诺很快解释了一个类似的问题,让垂直卷轴页面化,这可能对他的问题有所帮助。
@Composable
fun VerticalScroller(
    scrollerPosition: ScrollerPosition = +memo { ScrollerPosition() },
    onScrollPositionChanged: (position: Px, maxPosition: Px) -> Unit = { position, _ ->
        scrollerPosition.value = position
    },
    isScrollable: Boolean = true,
    @Children child: @Composable() () -> Unit
) {
    Scroller(scrollerPosition, onScrollPositionChanged, true, isScrollable, child)
}
@Composable
fun StationsScreen(deviceLocation: LocationData, openDrawer: () -> Unit)
{

    var scrollPosition = ScrollPosition(0.px,0.px)

    var myScrollerPosition = +memo{ ScrollerPosition ()}  //<--- make my own scrollerPosition

    FlexColumn {
        inflexible {
            TopAppBar(
                title = {Text(text = "Stations")},
                navigationIcon = {
                    VectorImageButton(id = R.drawable.ic_baseline_menu_24) {
                        openDrawer()
                    }
                }
            )
        }
        inflexible {
            Column (
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ){

                LocationWidget(deviceLocation)
            }
        }
        inflexible {
            Column(
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ){
                PushWidget(){
                    deviceLocation.lat++
                    deviceLocation.lng++
                }
            }
        }
        inflexible{
            Column(
                mainAxisSize = LayoutSize.Expand,
                crossAxisSize = LayoutSize.Expand
            ) {
                ScrollPosWidget(scrollPosition = scrollPosition)
            }
        }
        flexible(flex = 1f)
        {
            VerticalScroller (
                scrollerPosition = myScrollerPosition,
                onScrollPositionChanged = { px: Px, px1: Px ->
                    scrollPosition.posX = px
                    scrollPosition.maxX = px1
                    myScrollerPosition.value = px //<-- remember to set the new value here

                    // You can now use the difference of maxX and posX to load
                    // new items into the list...

            }){

                Column {

                    for(i in 0..20) {
                        HeightSpacer(16.dp)
                        imageBank.forEach { imageItem: ImageItem ->

                            Text(text = imageItem.title ?: "<Empty>")

                            Divider()
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun LocationWidget(locationData: LocationData){

    Surface {
        Padding(padding = 8.dp) {
            Text(text = "${locationData.lat}, ${locationData.lng}")
        }
    }

}

@Composable
fun PushWidget(action: () -> Unit){

    Surface {
        Padding(padding = 8.dp) {
            Button(text = "Click Me!", onClick = action)
        }
    }
}

@Composable
fun ScrollPosWidget(scrollPosition: ScrollPosition){
    Surface {
        Padding(padding = 8.dp) {
            Text(text = "posX=${scrollPosition.posX}, maxX=${scrollPosition.maxX}")
        }
    }
}