使用 Compose 导航不适用于 Android 上的 Google 地图
Posted
技术标签:
【中文标题】使用 Compose 导航不适用于 Android 上的 Google 地图【英文标题】:Navigating with Compose not working with Google Maps on Android 【发布时间】:2022-01-13 15:44:04 【问题描述】:我有一个包含谷歌地图视图的组合。当我点击地图上的一个图钉时,我想触发navController.navigate
,这样我就可以导航到另一个可组合项。但是,当我调用它时,应用程序会卡住而不是导航。点击按钮导航按预期工作。
我还创建了一个非常简单的应用程序来演示这个问题。 MainActivity
看起来像这样:
class MainActivity : ComponentActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContent
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "Screen1")
composable("Screen1")
Button( navController.navigate("MapsScreen") )
Text(text = "Go to Maps")
composable("MapsScreen")
val mapView = rememberMapViewWithLifecycle()
androidView( mapView ) mapView ->
mapView.getMapAsync map ->
map.setOnInfoWindowClickListener
navController.navigate("Screen1")
val markerOptions = MarkerOptions()
.position(LatLng(41.390205, 2.154007))
.title("Barcelona")
map.addMarker(markerOptions)!!
@Composable
fun rememberMapViewWithLifecycle(): MapView
val context = LocalContext.current
val mapView = remember
MapView(context).apply
id = R.id.map
val lifecycle = LocalLifecycleOwner.current.lifecycle
DisposableEffect(lifecycle, mapView)
// Make MapView follow the current lifecycle
val lifecycleObserver = getMapLifecycleObserver(mapView)
lifecycle.addObserver(lifecycleObserver)
onDispose
lifecycle.removeObserver(lifecycleObserver)
return mapView
private fun getMapLifecycleObserver(mapView: MapView): LifecycleEventObserver =
LifecycleEventObserver _, event ->
when (event)
Lifecycle.Event.ON_CREATE -> mapView.onCreate(Bundle())
Lifecycle.Event.ON_START -> mapView.onStart()
Lifecycle.Event.ON_RESUME -> mapView.onResume()
Lifecycle.Event.ON_PAUSE -> mapView.onPause()
Lifecycle.Event.ON_STOP -> mapView.onStop()
Lifecycle.Event.ON_DESTROY -> mapView.onDestroy()
else -> throw IllegalStateException()
在项目中,我使用androidx.navigation:navigation-compose:2.4.0-beta02
,根据documentation,这是目前的最新版本。
完整的项目可在Github获得
作为我使用的示例的灵感: Using Google Maps in a Jetpack Compose app 和 Crane Sample
可能是什么问题以及如何解决?
【问题讨论】:
当通过在 AndroidView 中添加 android.widget.Button 而不是地图导航来完成相同的实验时,请参阅同一存储库中的分支按钮以获取更多详细信息。 【参考方案1】:当您在setOnInfoWindowClickListener
方法中导航时,似乎会导致死锁。
尝试异步导航到您的目标以规避死锁,例如通过在Dispatchers.Main
上使用GlobalScope.launch
,这样监听器就可以运行到最后而不会出现任何死锁:
map.setOnInfoWindowClickListener
GlobalScope.launch(Dispatchers.Main)
navController.navigate("Screen1")
【讨论】:
它可以解决问题,谢谢:)【参考方案2】:经过一些调试,我得出的结论是问题与Lifecycle.Event.ON_STOP -> mapView.onStop()
getMapLifecycleObserver
有某种关系
删除它可以解决问题。
我对解决方案不满意,如果有人能够提供更好的解决方案,或者至少提供解释有关问题的更多详细信息的答案,我会很高兴。
【讨论】:
以上是关于使用 Compose 导航不适用于 Android 上的 Google 地图的主要内容,如果未能解决你的问题,请参考以下文章
docker-compose 日志记录不适用于 syslog 选项