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

Flutter集成google_maps_flutter 2.0.6后标记闪烁问题求助

解决Google Maps Flutter标记闪烁问题

嘿,我之前也碰到过这个标记时不时闪烁的坑,咱们来聊聊怎么搞定它!

问题根源

你现在用的是StatelessWidget,每次build方法执行时,都会重新创建整个markers集合以及里面的Marker实例。哪怕这些标记的位置和ID完全没变,Google Maps插件也会把它们当成全新的标记,重新渲染一遍——这就是闪烁的原因。

解决方案1:改用StatefulWidget缓存标记

把组件改成StatefulWidget,把markers集合存在State类里,这样每次build时不会重复创建这些标记实例,插件就不会误判为新标记了:

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

class RouteMapScreen extends StatefulWidget {
  const RouteMapScreen({Key? key}) : super(key: key);

  @override
  State<RouteMapScreen> createState() => _RouteMapScreenState();
}

class _RouteMapScreenState extends State<RouteMapScreen> {
  final LatLng _center = LatLng(49.975015, 9.146784);
  final Set<Marker> _markers = {
    Marker(
      markerId: const MarkerId("1"),
      position: const LatLng(49.9775, 9.1432),
    ),
    Marker(
      markerId: const MarkerId("2"),
      position: const LatLng(49.9785, 9.1432),
    )
  };

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      key: const Key("SingleRoute"),
      mapType: MapType.normal,
      markers: _markers,
      initialCameraPosition: CameraPosition(
        target: _center,
        zoom: 15.0,
      ),
    );
  }
}

解决方案2:使用const构造函数(静态标记场景)

如果你的标记是固定不变的(位置、ID都不会改),可以用const关键字标记Marker和集合,让它们在编译时就确定实例,避免每次build重新创建:

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

class RouteMapScreen extends StatelessWidget {
  final LatLng _center = const LatLng(49.975015, 9.146784);
  final Set<Marker> _markers = const {
    Marker(
      markerId: MarkerId("1"),
      position: LatLng(49.9775, 9.1432),
    ),
    Marker(
      markerId: MarkerId("2"),
      position: LatLng(49.9785, 9.1432),
    )
  };

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      key: const Key("SingleRoute"),
      mapType: MapType.normal,
      markers: _markers,
      initialCameraPosition: const CameraPosition(
        target: LatLng(49.975015, 9.146784),
        zoom: 15.0,
      ),
    );
  }
}

额外提示

如果你的标记是动态的(比如位置会随业务逻辑更新),记得只在标记真正变化时调用setState更新_markers集合,不要在每次build都重新创建,这样就能避免不必要的闪烁啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:37:52