【问题标题】:Iterate markers Google Flutter maps迭代标记 Google Flutter 地图
【发布时间】:2019-06-02 02:48:45
【问题描述】:

我正在尝试在新的 google flutter map 中迭代标记。

我使用 Web 服务检索坐标数组,然后迭代元素并获取具有纬度和经度的索引。

for (int i = 0; i < list.length; i++) {
 mapController.addMarker(MarkerOptions(position:  list[0].values.elementAt(i)))));
}

还有地图选项。

GoogleMapController mapController;

GoogleMap(
     onMapCreated: (GoogleMapController mapController) {
          mapController = mapController;         
     },
     options: GoogleMapOptions(
          mapType: MapType.satellite,
          myLocationEnabled :true,
          cameraPosition: CameraPosition(
          target: LatLng(40.347022, -3.750381), zoom: 5.0),
    ),
),

我认为 mapController 应该采用我放在 for 循环中的坐标,但它不起作用。控制台返回

在 null 上调用了方法“addMarker”。

所以问题是,如何使用谷歌颤振地图包动态添加多个标记?

我也试过这个简单的代码并且工作正常,所以添加标记时出现错误。

  GoogleMapController mapController;

    GoogleMap(
                  onMapCreated: (GoogleMapController mapController) {
                    mapController = mapController;
                    mapController.addMarker(MarkerOptions(
                      position:LatLng(40.347022, -3.750381),          
                      infoWindowText: InfoWindowText("Title", "Content"),
                      //icon:
                    ));
                     mapController.addMarker(MarkerOptions(
                      position:LatLng(43.321871, -3.006887),          
                      infoWindowText: InfoWindowText("Title", "Content"),
                      //icon:
                    ));

                  },
                  options: GoogleMapOptions(
                    mapType: MapType.satellite,
                    myLocationEnabled :true,
                    cameraPosition: CameraPosition(
                        target: LatLng(40.347022, -3.750381), zoom: 5.0),
                  ),
                ),

更新 2

我找到了这个示例代码。这正是我想要的,但我不能重复此代码,返回此错误

https://github.com/gerryhigh/Flutter-Google-Maps-Demo/blob/master/lib/venues.dart

NoSuchMethodError:getter 'className' 在 null 上被调用。

【问题讨论】:

    标签: google-maps dart flutter


    【解决方案1】:

    在第一个示例中,GoogleMapController 参数和您的局部变量具有相同的名称,所以基本上,局部变量会被隐藏,并且您正在将函数参数值分配给它自己。重命名这两个之一应该可以解决问题。

    【讨论】:

    • 不起作用。返回没有制造商的地图。我更新问题。
    • 您能否确认您正确引用了坐标?项目在 list.length 上迭代,但随后您尝试访问第一个项目的 i 处的元素。
    【解决方案2】:

    我在主构建函数中调用了一个谷歌地图的实例。像这样:

    return GoogleMap(
      onMapCreated: _onMapCreated,
      options: GoogleMapOptions(
        cameraPosition: CameraPosition(
          target: _center1,
          zoom: 11.0,
        ),
      ),
    );
    

    “_onMapCreated”函数内部是迭代器:

    widget.model.allItems.forEach((item) {
      //print("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
      print(item.lat);
    
      var newItem = LatLng(double.parse(item.lat), double.parse(item.lon));
      mapController.addMarker(
        MarkerOptions(
          icon: BitmapDescriptor.fromAsset(assetName),
          position: newItem,
        ),
      );
    });
    

    这对我有用。

    【讨论】:

      【解决方案3】:
      void populateOrder(Item item) async {
      if (item != null) {
        for (int i = 0; i < item.feature.length; i++) {
          var position = item.feature[i];
          if (position != null) {
            try {
              if (double.parse(position.latitude) != null &&
                  double.parse(position.longitude) != null) {
                 mapController.clearMarkers().then((value){
                   mapController.addMarker(
                    MarkerOptions(
                      position: LatLng(double.parse(position.latitude),
                          double.parse(position.longitude)),
                      infoWindowText: InfoWindowText(position.schet, ""),
                      icon: BitmapDescriptor.defaultMarker,
                    ),
                  );
                });
              }
            } catch (e) {
              print(e);
            }
          }
        }
      }
      

      }

      void _onMapCreated(GoogleMapController controller) {
      mapController = controller;
      populateOrder(itemize);
      Future.delayed(Duration(seconds: 6));
      

      }

      【讨论】:

      【解决方案4】:

      库已更新:这就是我能够在地图上显示多个标记的方式。

           Completer<GoogleMapController> _controller = Completer();
               // initial camera position
               CameraPosition _cameraPos;
           // A map of markers
               Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
              // function to generate random ids
              int generateIds() {
                    var rng = new Random();
                    var randomInt;      
                      randomInt = rng.nextInt(100);
                      print(rng.nextInt(100));
                    return randomInt;
                  }
      
                  //call this function in initstate
                  // I'm getting a json Object with locations from an 
                  // external api
                  buildMarkers() {
                        for (var i = 0; i < gridItem.locations.length; i++) {
                          var markerIdVal = generateIds();
                        final MarkerId markerId = MarkerId(markerIdVal.toString());
                          final Marker marker = Marker(
                        markerId: markerId,
                        position: LatLng(
                         gridItem.locations[i].latitude,
                          gridItem.locations[i].longitude,
                        ),
                        infoWindow: InfoWindow(title: gridItem.locations[i].place, snippet: gridItem.locations[i].region),
                      );
      // you could do setState here when adding the markers to the Map
                       markers[markerId] = marker;
      
                        }
                        print("Length:: + ${markers.length}");
                      }
          // your Googlemaps Widget somewhere in your widget tree
          GoogleMap(
                    mapType: MapType.normal,
                    initialCameraPosition: _cameraPos,
                    gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[Factory<OneSequenceGestureRecognizer>(()=>ScaleGestureRecognizer())].toSet(),
                    markers: Set<Marker>.of(markers.values),
                    onMapCreated: (GoogleMapController controller) {
                                   _controller.complete(controller);}),
      

      【讨论】:

      • @RutvikGumasana gridItem 只是一个包含经度和纬度的列表,让我给它一个更通用的名称
      • 不知道如何在这里处理 griditem。尝试传入一个列表,但无法让它工作。
      猜你喜欢
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2023-02-07
      • 1970-01-01
      相关资源
      最近更新 更多