通过ComposeView互操作在协调员Layout内合成LazyColumn滚动行为

Compose LazyColumn scrolling behavior inside of CoordinatorLayout via ComposeView interop(通过ComposeView互操作在协调员Layout内合成LazyColumn滚动行为)
本文介绍了通过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滚动行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)