本文介绍了通过ComposeView互操作在协调员Layout内合成LazyColumn滚动行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题-向下滚动会导致底部的工作表滚动,而不是为LazyColumn提供滚动优先级(RecclerView没有此问题。它由NestedScrollView包装)

我刚刚介绍了一个组成LazyColumn的替换,它替换了一个协调员Layout中的回收器。协调器(作为底页实现)本身可以在PEEK和展开状态之间自由滚动。我的问题是,当在LazyColumn中向下拖动Items区域时,底部的工作表会选择滚动,而不是LazyColumn。如果我先在LazyColumn上向上滚动,然后向下滚动(没有松开),则LazyColumn会拾取滚动,并向LazyColumn赋予滚动优先级(预期行为)。

BottomSheetFragment
|-CoordinatorLayout
|--ConstraintLayout (BottomSheetBehavior)
|---MyListFragment
|----ComposeView
|-----Theme
|------Surface
|-------Box
|--------LazyColumn

新作曲,所以我希望有人能告诉我如何更正这个新的滚动行为?

**编辑我通过切换协调员的^^BottomSheetBehavior.isDragglable来实现这一点,但它确实需要我释放拖拽,而不是平稳地从列表滚动到底部工作表滚动-有人建议解决方法吗?:

fun MyUi(listener:Listener) {
    val listState = rememberLazyListState()

    LaunchedEffect(listState) {
        listState.interactionSource.interactions.collect {
            //at the top of the list so allow sheet scrolling
            listener.allowSheetDrag(listState.firstVisibleItemScrollOffset == 0)
        }
    }

    val nestedScrollConnection = remember {
        object : NestedScrollConnection {
            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
                Timber.i("NestedScrollConnection onPreScroll($available: Offset, $source: NestedScrollSource)")
                return super.onPreScroll(available, source)
            }

            override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
                Timber.i("NestedScrollConnection onPostScroll($consumed: Offset, $available: Offset, $source: NestedScrollSource)")
                if (available.y > 0.0 && consumed.y == 0.0f) {
                    //scolling down up but we're already at the top - kick over to sheet scrolling
                    listener.allowSheetDrag(true)
                }
                return super.onPostScroll(consumed, available, source)
            }
        }
    }
    Box(
        modifier = Modifier
            .fillMaxSize()
            .nestedScroll(nestedScrollConnection)
    ) {
        LazyColumn(
            modifier =
            Modifier
                .fillMaxSize()
                .padding(vertical = 12.dp), state = listState
        ) {
            item {
                Row() {}
            }
        }
    }
}

然后在片段中:

override fun allowSheetDrag(allowSheetDrag: Boolean) {
    bottomSheetFragment?.bottomSheetBehavior?.isDraggable = allowSheetDrag
}

推荐答案

向导Chris Banes最近发布了一个解决方法,我可以确认它是有效的:https://gist.github.com/chrisbanes/053189c31302269656c1979edf418310

BottomSheetDialog(向上滚动,然后一次向下拖动工作表)中使用时,无需抬起手指,它也可以很好地过渡

示例用法(摘自Chris Banes的示例):

setContent {
    Surface(
        // Add this somewhere near the top of your layout, above any scrolling layouts
        modifier = Modifier.nestedScroll(rememberViewInteropNestedScrollConnection())
    ) {
        LazyColumn() {
            // blah
        }
    }
}

跟踪使用ComposeView进行嵌套滚动的问题:https://issuetracker.google.com/issues/174348612,以及将我引向此处的相关SO问题:AndroidView in Compose loses touch events in NestedScrollView

这篇关于通过ComposeView互操作在协调员Layout内合成LazyColumn滚动行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 05:37