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

Flutter 中如何调整 GoogleMap 标记(Marker)尺寸并适配屏幕

解决方案

你的代码中fromAssetImage传入的size参数未生效,是因为ImageConfiguration缺少设备像素比配置,且固定尺寸无法适配不同屏幕规格,你可以选择以下两种方式解决:

方案1:手动缩放图片(推荐)

这种方式适配精度更高,可灵活根据屏幕尺寸比例设置Marker大小:

  1. 先导入依赖包
import 'dart:ui' as ui;
import 'package:flutter/services.dart';
  1. 新增自定义缩放工具方法
Future<BitmapDescriptor> getResizedMarker(String assetPath, double targetWidth) async {
  ByteData data = await rootBundle.load(assetPath);
  ui.Codec codec = await ui.instantiateImageCodec(
    data.buffer.asUint8List(),
    targetWidth: targetWidth.round(),
  );
  ui.FrameInfo fi = await codec.getNextFrame();
  final byteData = await fi.image.toByteData(format: ui.ImageByteFormat.png);
  final Uint8List imageBytes = byteData!.buffer.asUint8List();
  return BitmapDescriptor.fromBytes(imageBytes);
}
  1. 修改初始化逻辑,将原initState中的图标初始化逻辑移到didChangeDependencies中,适配屏幕尺寸:
@override
void didChangeDependencies() {
  super.didChangeDependencies();
  final queryData = MediaQuery.of(context);
  // 按屏幕宽度比例设置Marker宽度,比如占屏幕宽度的8%,可自行调整比例
  final targetMarkerWidth = queryData.size.width * 0.08;
  getResizedMarker('images/MareaBlancFondBlanc.png', targetMarkerWidth)
    .then((value) {
      setState(() {
        iconMareaEstLa = value;
        // 图标加载完成后添加Marker,避免出现默认图标闪烁
        _listMk.add(
          Marker(
            markerId: const MarkerId('MKIDPOSMAREA'),
            draggable: false,
            icon: iconMareaEstLa,
            position: LatLng(posMareaLat,posMareaLng),
          )
        );
      });
    });
}
  1. 删除原_onMapCreated中添加Marker的逻辑,避免重复添加。

方案2:修改原有fromAssetImage配置

如果不想新增工具方法,可给ImageConfiguration补充设备像素比参数适配分辨率:

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  final queryData = MediaQuery.of(context);
  BitmapDescriptor
    .fromAssetImage(
      ImageConfiguration(
        size: const Size(50,50),
        // 补充设备像素比参数
        devicePixelRatio: queryData.devicePixelRatio,
      ),
      'images/MareaBlancFondBlanc.png')
    .then((value) => iconMareaEstLa = value);
}

注意:该方案适配效果不如方案1稳定,不同设备可能出现尺寸偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:05