Jetpack Compose:拖动 MapView 时会打开 Scaffold 抽屉

Posted

技术标签:

【中文标题】Jetpack Compose:拖动 MapView 时会打开 Scaffold 抽屉【英文标题】:Jetpack Compose: Scaffold drawer opens when dragging MapView 【发布时间】:2021-10-04 04:58:59 【问题描述】:

在 Jetpack Compose 脚手架中使用抽屉时,可以使用手势来打开和关闭它。 如果脚手架内容包含 MapView,则无法水平拖动地图。而是打开了抽屉。

当水平拖动(滚动)可滚动行时,不会发生这种情况,抽屉不会打开。

当用户拖动地图时,如何防止抽屉打开?当剩余脚手架内容被拖动时,手势应该仍然有效。

不幸的是,用Row 包裹androidView 并不能解决问题,以及使用ModalDrawer 代替脚手架。


使用 Compose rc02 和 kotlin 1.5.10 重现的代码(编辑:使用 Compose 1.0.3 和 Kotlin 1.5.30 验证):

class MainActivity : ComponentActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContent 
            MaterialTheme 
                Scaffold(
                    drawerContent = 
                        Text("Drawer Content")
                    ,
                    content = 
                        Column 
                            Text("Dragging here should open the drawer")

                            val mapView = rememberMapViewWithLifecycle()
                            AndroidView( mapView , Modifier.fillMaxSize())
                        
                    
                )
            
        
    

函数rememberMapViewWithLifecycle()取自Crane sample app。

【问题讨论】:

【参考方案1】:

当我尝试使用 Jetpack Compose 将 MapBox 集成到带有 NavigationDrawer 的应用程序中时,发生了类似的事情。 我所做的是添加脚手架的属性drawerGesturesEnabled = false,这样当我单击菜单图标时,NavigationDrawer 将继续工作

如果你使用drawerGesturesEnabled = scaffoldState.drawerState.isOpen可以正常关闭

【讨论】:

scaffoldState.drawerState.isOpen 解决方案是我目前使用的。这似乎是我们能做的最好的了。然而,我真正想要的是一些允许使用拖动手势打开抽屉的解决方案 - 仅在拖动地图时禁用。【参考方案2】:

Compose 开发人员根据这张票修复了问题:https://issuetracker.google.com/issues/202569585

显然今天的 1.1.0-beta03 版本中不包含该修复,我想我们必须等待下一个。

【讨论】:

以上是关于Jetpack Compose:拖动 MapView 时会打开 Scaffold 抽屉的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Compose之手势使用

Jetpack Compose 从入门到入门

Jetpack Compose 从入门到入门

Jetpack All In Compose ?看各种Jetpack库在Compose中的使用

Android Jetpack Compose学习—— Jetpack compose基础布局

Android Jetpack Compose学习—— Jetpack compose基础布局