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

Flutter google_maps_flutter插件onTap触发正常但无法添加标记问题

GoogleMapsFlutter点击地图添加标记不显示修复方案

核心问题原因排查

  • Marker锚点参数设置错误
    你代码中anchor参数传入了Offset(100, 160),该参数为Marker的相对偏移量,取值范围是0~1,代表相对于Marker自身宽高的比例,用于指定Marker的哪个点与你传入的经纬度坐标对齐。传入远大于1的数值会导致Marker直接偏移到地图可视区域之外,表现为标记添加成功但看不到。
    默认锚点为Offset(0.5, 1.0),代表Marker底部中心和坐标点对齐,符合常规使用习惯。

  • markers变量定义位置错误
    如果你的var markers = Set<Marker>();是写在build方法内部,每次调用setState触发页面重绘时,markers都会被重新初始化为空集合,刚添加的标记会被直接清空。

  • 初始缩放级别过低
    如果initialCameraPosition没有设置zoom参数,默认缩放级别为0,为全球视图,单个标记尺寸过小也会难以识别。

修复后的代码示例

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';

class MapPage extends StatefulWidget {
  const MapPage({super.key});

  @override
  State<MapPage> createState() => _MapPageState();
}

class _MapPageState extends State<MapPage> {
  // 将markers定义为State类的成员属性,不要放在build方法内
  final Set<Marker> markers = <Marker>{};
  final Completer<GoogleMapController> _mapController = Completer();
  // 替换为你的实际初始定位坐标
  final LatLng currentLocation = const LatLng(39.9042, 116.4074);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          Positioned.fill(
            child: GoogleMap(
              onTap: (LatLng point) {
                print(point.longitude.toString());
                final snackBar = SnackBar(
                  content: Text(point.longitude.toString()),
                  action: SnackBarAction(
                    label: 'Undo',
                    onPressed: () {
                      // 可选:实现撤销添加标记逻辑
                      setState(() {
                        markers.removeWhere((marker) => marker.markerId == MarkerId(point.toString()));
                      });
                    },
                  ),
                );
                ScaffoldMessenger.of(context).showSnackBar(snackBar);
                setState(() {
                  markers.add(Marker(
                    markerId: MarkerId(point.toString()),
                    position: point,
                    infoWindow: InfoWindow(
                      title: 'I am a marker in ${point}',
                    ),
                    icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueMagenta),
                    // 修正锚点为合理取值
                    anchor: const Offset(0.5, 1.0),
                  ));
                });
              },
              myLocationEnabled: true,
              zoomControlsEnabled: false,
              markers: markers,
              initialCameraPosition: CameraPosition(
                target: currentLocation,
                // 添加初始缩放级别,14为城市街道级视图
                zoom: 14,
              ),
              onMapCreated: (GoogleMapController controller) {
                _mapController.complete(controller);
              },
            ),
          ),
        ],
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者cubanGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:06:00