flutter web 腾讯地图

634 阅读2分钟

使用flutter web 搭建腾讯地图基础插件 只提供思路 具体功能还需要自己实现,参考 玩玩Flutter Web —— 实现高德地图插件 使用逻辑一致

效果如下

1657074174405.jpg

1.添加腾讯地图回调函数 js

image.png

添加 tenxunmapjs.js

var resolve1;

function loadMap(key) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.charset = "utf-8";
    script.src = "https://map.qq.com/api/js?v=2.exp&key=" + key + "&callback=initMap";
    document.body.appendChild(script);
    return new Promise((resolve, reject) => {
        this.resolve1 = resolve;
    });
}

function initMap() {
    resolve1('ok')
}

添加 tenxunmapjs.dart

import 'package:js/js.dart';


@JS('loadMap')
external loadMap(String key);

index.html 引入

<script src="map/tenxunmap.js"></script>

2、添加地图tmapjs.dart

@JS('qq.maps')
library tmap;

import 'package:js/js.dart';

/// 腾讯地图js,文档:https://lbs.qq.com/javascript_v2/doc/mapoptions.html

@JS("Map")
class TMap {
  // (必填) 地图DOM容器的id,创建地图需要在页面中创建一个空div元素,传入该div元素的id
  external TMap(dynamic domId, MapOptions options);

  //设置中心点
  external setCenter(LatLng latLng);

  external getCenter();

  // 设置地图显示的缩放级别 支持3~20。
  external setZoom(num zoom);

  external getZoom();


}



@JS()
class LatLng {
  external LatLng(num lat, num lng);

  external num getLng();

  external num getLat();
}

@JS()
@anonymous
class MapOptions {
  external factory MapOptions({
    /// 初始中心经纬度
    LatLng center,

    /// 地图显示的缩放级别
    num zoom,

    ///比例尺控件的初始启用/停用状态。
    bool /*‘2D’|‘3D’*/ scaleControl,

    ///平移控件的初始启用/停用状态。
    bool /*‘2D’|‘3D’*/ panControl,

    /// 地图类型控件的初始启用/停用状态。
    bool /*‘2D’|‘3D’*/ mapTypeControl,
    ///缩放控件的初始启用/停用状态。
    bool /*‘2D’|‘3D’*/ zoomControl,
  });

  external LatLng get center;

  external num get zoom;


  external bool get scaleControl;

  external bool get panControl;

  external bool get mapTypeControl;

  external bool get zoomControl;
}

3、添加地图监听 eventjs.dart

@JS('qq.maps.event')
library tmap;

import 'package:js/js.dart';
//import 'package:web_tenxun_map/web/tmapjs.dart'; 导入tmapjs.dart 中路径


external  addListener(TMap map,String type, Function callback);

4、使用地图

/// 这里使用时间作为唯一标识
_divId = DateTime.now().toIso8601String();

/// 先创建div并注册
// ignore: undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory(_divId, (int viewId) {
  /// 地图需要的Div
  _element = DivElement()
    ..id = "ten-xun-map"
    ..style.width = '100%'
    ..style.height = '100%'
    ..style.margin = '0';
  return _element;
});

SchedulerBinding.instance.addPostFrameCallback((_) async {
  /// 创建地图
  var promise = loadMap(widget.mapKey);

  promiseToFuture(promise).then((value) {
    final MapOptions _mapOptions = MapOptions(
        zoom: 20,
        // scaleControl: false,
        // panControl: false,
        mapTypeControl: false,
        zoomControl: false,
        center: LatLng(lat, lon));

    aMap = TMap(_element.id, _mapOptions);
    addListener(aMap!, "center_changed", allowInterop((event) {
       地图变化回调
    }));
  }, onError: (e) {
    print('初始化错误:$e');
  });
});