如何判断Jetpack Compose中GoogleMap是否从缓存加载?
判断Jetpack Compose中GoogleMap是否从缓存加载并控制显示
核心思路
Google Maps SDK没有直接提供判断地图瓦片是否来自缓存的API,但可以通过网络状态监听结合地图加载状态回调间接实现需求:当设备离线且地图无法加载缓存内容时,隐藏地图组件。
具体实现步骤
1. 监听设备网络状态
使用Android的ConnectivityManager实时监听网络连接状态,判断设备是否在线。
示例代码(Compose中使用):
val context = LocalContext.current val isOnline by remember { mutableStateOf( ConnectivityManagerCompat.getNetworkCapabilities( context.getSystemService(ConnectivityManager::class.java), context.getSystemService(ConnectivityManager::class.java).activeNetwork )?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true ) } // 注册网络变化监听 DisposableEffect(Unit) { val connectivityManager = context.getSystemService(ConnectivityManager::class.java) val callback = object : ConnectivityManager.NetworkCallback() { override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { isOnline = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) } override fun onLost(network: Network) { isOnline = false } } connectivityManager.registerNetworkCallback( NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(), callback ) onDispose { connectivityManager.unregisterNetworkCallback(callback) } }
2. 监听GoogleMap的加载状态
利用GoogleMap的onMapLoaded和onMapFailed回调,结合网络状态判断缓存是否可用:
- 离线状态下,
onMapLoaded正常回调说明缓存可用,保持地图显示; - 离线状态下,
onMapFailed触发说明无可用缓存,隐藏地图。
示例代码:
var mapLoadedSuccessfully by remember { mutableStateOf(false) } var shouldShowMap by remember { mutableStateOf(true) } GoogleMap( modifier = if (shouldShowMap) modifier.fillMaxSize() else modifier.size(0.dp), cameraPositionState = cameraPositionState, uiSettings = uiSettings, onMapLoaded = { mapLoadedSuccessfully = true if (!isOnline) { shouldShowMap = true } }, onMapFailed = { _ -> mapLoadedSuccessfully = false if (!isOnline) { shouldShowMap = false } } )
3. 初始状态处理
应用启动时,若设备离线先默认隐藏地图,直到onMapLoaded确认缓存可用再显示:
LaunchedEffect(isOnline) { shouldShowMap = isOnline }
补充说明
- Google Maps的缓存由SDK自动管理,无法直接查询缓存内容或时长,但通过上述方式可间接判断缓存可用性;
- 测试时需确保设备完全离线(关闭Wi-Fi和移动数据),避免网络切换导致误判;
- 可结合Compose的
SnapshotState优化状态管理,保证UI更新一致性。
内容的提问来源于stack exchange,提问作者Viks
相关产品推荐
相关产品推荐

