//百度地圖的腦殘設計,用Flutter添加多個BMFMarker時,必須在添加BMFMarker時自己保存ID,否則回應點擊時無法確定用戶點擊的是哪個標簽
//代碼不會回傳,也沒有任何檔案說明,是花了一天時間搜索網路無果,是自己翻江倒海摸索出來的
//這不自然地讓我想起昨天聽“得到”的一本書,叫做《是我把你蠢哭了嗎》,真讓人哭笑不得...
//附上代碼,為后來的碼農們...
//https://www.cnblogs.com/ybmj/p/14408263.html
//百度地圖的腦殘設計,附上代碼,為后來的碼農們...
Future getListBMFMarker({List listDwinfo}) async {
if (null == listDwinfo) {
listDwinfo = listDwinfoGetList2;
}
//double _scale = 9900 / 10000; //自己控制off_latitude、off_longitude效果不好
// BMFMarker marker1 = BMFMarker(
// position: BMFCoordinate(29.807061, 107.607091),
// title: 'xxxx',
// subtitle: 'test',
// identifier: 'flutter_marker',
// icon: 'assets/images/location.png',
// enabled: enable,
// draggable: dragable);
int len = listDwinfo.length;
for (int i = 0; i < len; i++) {
BMFMarker marker = BMFMarker(
position: getBMFCoordinate(listDwinfo[i]["dwzb"]),
title: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}',
subtitle: 'test',
identifier: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}',
icon: 'assets/images/location.png',
/// 默認情況下, annotation view的中心位于annotation的坐標位置,
/// 可以設定centerOffset改變view的位置,正的偏移使view朝右下方移動,負的朝左上方,單位是像素
/// 目前Android只支持Y軸設定偏移量對應SDK的 yOffset(int yOffset) 方法
centerOffset: BMFPoint(100, 110),
//標記中心偏移
enabled: enable,
draggable: dragable);
// 百度地圖的腦殘設計,用Flutter添加多個BMFMarker時,必須在添加BMFMarker時自己保存ID,
// 否則回應點擊時無法確定用戶點擊的是哪個定位標注
// 代碼不會自動回傳,也沒有任何檔案說明,是花了一天時間搜索網路無果,是自己翻江倒海摸索出來的
// 下一句是關鍵代碼,將添加的每個BMFMarker的id保存到一個map中,
// 這樣在用setMapClickedMarkerCallback添加BMFMarker的通用回應函式中,便可以根據id號來判斷用戶點擊的是哪一個定位標注
g_map_BMFMarkerID_dwIndex[marker.getId()] = i;
g_listBMFMarker.add(marker);
g_listBMFText.add(BMFText(
text: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}',
//緯度偏移-上下 off_latitude, 經度偏移-左右 off_longitude
//已經在zoomLevel = 15時調整好定位標記與文本標記的相對位置
// ,當地圖縮放時,會發生位置變化,必須使用 Provider 或者 EventBus 進行跟蹤更新
//https://time.geekbang.org/column/article/131890
//老師,provider、eventBus的用途有啥區別嗎,都可以做狀態的通知
// 作者回復: Provider 主要是用來做資料讀寫共享;event_bus主要是用來做資料狀態通知、實作組件間單向資料傳遞,
//如果我們的應用足夠簡單,資料流動的方向和順序是清晰的,我們只需要將資料映射成視圖就可以了,
// 作為宣告式的框架,Flutter 可以自動處理資料到渲染的全程序,通常并不需要 Provider 狀態管理,
// position: getBMFCoordinate(listDwinfo[i]["dwzb"],
// off_latitude: -0.0002 * g_zoomLevel * _scale,
// off_longitude: -0.00009 * g_zoomLevel * _scale),
position: getBMFCoordinate(listDwinfo[i]["dwzb"]),
//自己控制off_latitude、off_longitude效果不好
bgColor: Colors.yellow,
fontColor: Colors.black,
fontSize: 35,
// typeFace:
// BMFTypeFace(familyName: BMFFamilyName.sMonospace, textStype: BMFTextStyle.BOLD_ITALIC),
typeFace: BMFTypeFace(familyName: BMFFamilyName.sMonospace, textStype: BMFTextStyle.BOLD),
alignY: BMFVerticalAlign.ALIGN_TOP,
alignX: BMFHorizontalAlign.ALIGN_LEFT,
rotate: 0.0,
zIndex: 99));
}
}
//3、Marker 點擊回應,點擊文本標簽沒反應,加在此處有效
//點擊Marker時會回呼BaiduMap.OnMarkerClickListener,監聽器的實作方式示例如下:
/// 地圖marker點擊回呼
myMapController?.setMapClickedMarkerCallback(callback: (String id, dynamic extra) async {
myMapController.getZoomLevel().then((value) {
g_zoomLevel = value;
print('myMapController.getZoomLevel() = ${value.toString()}');
});
print('點擊 Marker 標簽回應:id = ${id}');
//百度地圖的腦殘設計,需要在添加BMFMarker時自己保存ID
//g_listBMFMarkerIDmap.add({marker.getId(): listDwinfo[i]["id"]});
print('Marker的 標簽回應:id = ${listDwinfoGetList2[g_map_BMFMarkerID_dwIndex[id]]["dwmc"]}');
_markerCallback(id, 'test'); //回應用戶點擊
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260478.html
標籤:其他
