addMarker method

Future<Marker> addMarker(
  1. MarkerOption option
)

添加marker

在纬度lat, 经度lng的位置添加marker, 并设置标题title和副标题snippet, iconUri 可以是图片url, asset路径或者文件路径. 其中图片参数imageConfig如果不知道怎么创建, 那么就直接调用flutter sdk内提供的createLocalImageConfiguration方法创建

Implementation

Future<Marker> addMarker(MarkerOption option) {
  assert(option != null);

  final lat = option.latLng.latitude;
  final lng = option.latLng.longitude;
  return platform(
    android: (pool) async {
      // 获取地图
      final map = await _androidController.getMap();

      // marker经纬度
      final latLng =
          await createcom_amap_api_maps_model_LatLng__double__double(
              lat, lng);

      // marker配置
      final markerOption =
          await createcom_amap_api_maps_model_MarkerOptions__();

      // 设置marker经纬度
      await markerOption.position(latLng);
      // 设置marker标题
      if (option.title != null) {
        await markerOption.title(option.title);
      }
      // 设置marker副标题
      if (option.snippet != null) {
        await markerOption.snippet(option.snippet);
      }
      // 设置marker图标
      // 普通图片
      if (option.iconUri != null && option.imageConfig != null) {
        Uint8List iconData =
            await _uri2ImageData(option.imageConfig, option.iconUri);

        final bitmap = await createandroid_graphics_Bitmap(iconData);
        final icon = await com_amap_api_maps_model_BitmapDescriptorFactory
            .fromBitmap(bitmap);
        await markerOption.icon(icon);

        pool..add(bitmap)..add(icon);
      }
      // widget as marker
      else if (option.widget != null) {
        Uint8List iconData = await _state.widgetToImageData(option.widget);

        final bitmap = await createandroid_graphics_Bitmap(iconData);
        final icon = await com_amap_api_maps_model_BitmapDescriptorFactory
            .fromBitmap(bitmap);
        await markerOption.icon(icon);

        pool..add(bitmap)..add(icon);
      }
      // 是否可拖拽
      if (option.draggable != null) {
        await markerOption.draggable(option.draggable);
      }
      // 旋转角度
      if (option.rotateAngle != null) {
        await markerOption.rotateAngle(option.rotateAngle);
      }
      // 锚点 和ios端统一为默认0.5
      await markerOption.anchor(option.anchorU ?? 0.5, option.anchorV ?? 0.5);

      final marker = await map.addMarker(markerOption);

      // 是否允许弹窗
      if (option.infoWindowEnabled != null) {
        await marker.setInfoWindowEnable(option.infoWindowEnabled);
      }

      // marker不释放, 还有用
      pool..add(map)..add(latLng)..add(markerOption);

      return Marker.android(marker);
    },
    ios: (pool) async {
      await _iosController.set_delegate(
        _iosMapDelegate.._iosController = _iosController,
      );

      // 创建marker
      final pointAnnotation = await createMAPointAnnotation();

      final coordinate = await createCLLocationCoordinate2D(lat, lng);

      // 设置经纬度
      await pointAnnotation.set_coordinate(coordinate);

      // 设置标题
      if (option.title != null) {
        await pointAnnotation.set_title(option.title);
      }
      // 设置副标题
      if (option.snippet != null) {
        await pointAnnotation.set_subtitle(option.snippet);
      }
      // 设置图片
      // 普通图片
      if (option.iconUri != null && option.imageConfig != null) {
        Uint8List iconData =
            await _uri2ImageData(option.imageConfig, option.iconUri);

        final icon = await createUIImage(iconData);

        // 由于ios端的icon参数在回调中设置, 无法在add的时候设置, 所以需要放到STACK中去
        // 供ios的回调去获取
        await pushStack('icon', icon);

        pool..add(icon);
      }
      // widget as marker
      else if (option.widget != null) {
        Uint8List iconData = await _state.widgetToImageData(option.widget);

        final icon = await createUIImage(iconData);

        // 由于ios端的icon参数在回调中设置, 无法在add的时候设置, 所以需要放到STACK中去
        // 供ios的回调去获取
        await pushStack('icon', icon);

        pool..add(icon);
      }
      // 是否可拖拽
      if (option.draggable != null) {
        await pushStackJsonable('draggable', option.draggable);
      }
      // 旋转角度
      if (option.rotateAngle != null) {
        await pushStackJsonable('rotateAngle', option.rotateAngle);
      }
      // 是否允许弹窗
      if (option.infoWindowEnabled != null) {
        await pushStackJsonable(
            'infoWindowEnabled', option.infoWindowEnabled);
      }
      // 锚点
      if (option.anchorU != null || option.anchorV != null) {
        await pushStackJsonable('anchorU', option.anchorU);
        await pushStackJsonable('anchorV', option.anchorV);
      }

      await _iosController.addAnnotation(pointAnnotation);

      // pointAnnotation不释放, 还有用
      pool..add(coordinate);

      return Marker.ios(pointAnnotation, _iosController);
    },
  );
}