You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:01:10