Flutter Map显示黑屏问题求助(真机异常/模拟器正常)
Flutter Map真机APK地图黑屏(Marker正常显示)的排查方案
问题概述
真机安装APK后,flutter_map的地图区域显示黑色,无法加载瓦片,但Marker能正常显示交互;模拟器和Web环境完全正常,目标是实现地图正常显示和导航功能。
核心原因排查
- 网络权限未配置:release包默认可能未开启网络权限,导致无法请求OpenStreetMap瓦片资源
- 瓦片源访问失败:部分地区网络环境下无法访问OpenStreetMap官方服务器
- 打包优化影响:release打包时的混淆、资源压缩可能破坏地图组件的正常加载逻辑
- HTTPS验证问题:真机对HTTPS证书的验证比模拟器严格,可能导致瓦片请求被拦截
解决步骤
1. 补全Android网络权限
打开android/app/src/main/AndroidManifest.xml,添加以下权限配置:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Android 9及以上默认禁止明文HTTP请求,当前使用的是HTTPS的OpenStreetMap地址,无需额外配置android:usesCleartextTraffic="true";若后续切换为HTTP瓦片源,需补充该配置。
2. 替换可访问的瓦片源
如果OpenStreetMap官方地址无法访问,替换为国内可用的瓦片源(需遵守对应服务商的使用协议),例如高德地图:
TileLayerOptions( minZoom: 1, maxZoom: 18, backgroundColor: Colors.black, urlTemplate: 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', subdomains: ['1', '2', '3', '4'], ),
3. 禁用影响地图的打包优化
在android/app/proguard-rules.pro中添加混淆豁免规则:
-keep class 'package:flutter_map.**' { *; } -keep class 'package:latlong2.**' { *; }
同时检查android/build.gradle,若开启了shrinkResources true,暂时关闭该配置测试,避免地图相关资源被误压缩删除。
4. 监听瓦片加载错误定位问题
添加瓦片加载错误监听,通过真机日志排查具体失败原因:
TileLayerOptions( // 原有配置保留... onTileError: (error, stackTrace, url) { print('瓦片加载失败:$url,错误信息:$error'); }, ),
使用flutter logs命令查看真机日志,即可明确是网络连接问题还是瓦片地址无效。
5. 更新组件版本
确保pubspec.yaml中flutter_map和latlong2使用最新稳定版本,避免版本兼容性问题:
dependencies: flutter_map: ^6.1.0 latlong2: ^0.9.0
用户原代码
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:latlong2/latlong.dart'; import 'package:flutter_map/flutter_map.dart'; class MapScreen extends StatefulWidget { @override State<MapScreen> createState() => MapScreenState(); } class MapScreenState extends State<MapScreen> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Stack( children: [ FlutterMap( mapController: MapController(), options: MapOptions( center: LatLng( 28.9, -13.5), zoom: 9.2, maxZoom: 12, minZoom: 2, ), layers: [ TileLayerOptions( minZoom: 1, maxZoom: 18, backgroundColor: Colors.black, urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c'], ), MarkerLayerOptions( markers: [ mapTag("Hello World", 51.5, -0.09), mapTag("Arrecife", 28.9, -13.5), ], ), ], ), ], ), ), ); } Marker mapTag(TagText, Lat, Long) { return Marker( width: 80.0, height: 80.0, point: LatLng(Lat, Long), builder: (ctx) => Container( child: Stack( children: [ Container( decoration: BoxDecoration( border: Border.all(color: Colors.white), color: Colors.grey[800], borderRadius: BorderRadius.all( Radius.circular(20), ), ), ), Padding( padding: const EdgeInsets.all(12.0), child: Text( TagText, style: TextStyle( fontWeight: FontWeight.bold, color: Colors.white), ), ), ], ), ), ); }
问题截图

内容的提问来源于stack exchange,提问作者Chewee133
相关产品推荐
相关产品推荐

