【问题标题】:How to add multiple markers on the google map如何在谷歌地图上添加多个标记
【发布时间】:2021-09-12 07:14:33
【问题描述】:

我正在尝试从从 firebase 读取的坐标中添加多个标记。它读取所有坐标并存储在列表中。我创建了 addMarker 函数来将标记添加到地图中。但它只打印一个标记,读取最后一个标记坐标。谁能帮我解决这个问题,因为我是新手。

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final textcontroller = TextEditingController();
  final databaseRef = FirebaseDatabase.instance.reference();
  Completer<GoogleMapController> _controller = Completer();
  Map<MarkerId, Marker> markers = <MarkerId, Marker>{};

  double latitude = 0;
  double longitude = 0;
  var myList = [];
  List<LatLng> list = [];

  void initState() {
    super.initState();
    setState(() {
      firebaseRead();
    });
  }

  void firebaseRead() {
    databaseRef.child('Locations').onValue.listen((Event event) {
      myList = event.snapshot.value;

      setState(() {
        for (int x = 0; x < myList.length; x++) {
          double latitude = myList[x]['lat'];
          double longitude = myList[x]['long'];
          LatLng location = new LatLng(latitude, longitude);
          if (list.contains(location)) {
            list.clear();
            list.add(location);
          } else {
            list.add(location);
          }

          addMarker(list[x]);
        }
      });

    });
    //print(list);
  }

  void addMarker(loc) {
    final MarkerId markerId = MarkerId('Marker 1');

    final Marker marker = Marker(
      markerId: markerId,
      position: LatLng(loc.latitude, loc.longitude),
      infoWindow: InfoWindow(title: 'test'),
    );

    setState(() {
      // adding a new marker to map
      markers[markerId] = marker;
      //print(marker);
    });
  }

  @override
  Widget build(BuildContext context) {
      return Scaffold(
      appBar: AppBar(
        title: Text("Firebase Demo"),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        markers: Set.of(markers.values),
        initialCameraPosition:
            CameraPosition(target: LatLng(6.9271, 79.8612), zoom: 15),
        onMapCreated: (GoogleMapController controller) {
          _controller.complete(controller);
        },
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () {
          firebaseRead();
        },
        label: const Text('Refresh'),
        icon: const Icon(Icons.refresh),
        backgroundColor: Colors.blueAccent,
      ),
    );
  }
}

【问题讨论】:

  • 这是因为您只有一个MarkerId,所以在调用markers[markerId] = marker; 后,地图markers 将始终只有一个项目
  • 你能告诉我为所有坐标点添加markerId的方法吗?
  • final MarkerId markerId = MarkerId(loc.toString()); 也许? (假设loc.toString() 返回有效的唯一String
  • 谢谢。它有效。

标签: android firebase flutter google-maps google-maps-markers


【解决方案1】:

我正在使用google_maps_flutter: ^0.5.30这个版本你可以这样做this:-

List<Marker> _markers = <Marker>[];

for(var track in myList){
        if(track["latitude"] != "" && track["latitude"] != "null"){
          _markers.add(Marker(markerId: MarkerId(myList.indexOf(track).toString()),
              position: LatLng(double.parse(track["latitude"]), double.parse(track["longitude"])),
              infoWindow: InfoWindow(title: track["Name"])));
        }
      }
      
      
      GoogleMap(
          initialCameraPosition: CameraPosition(
              target: latitude == null && longitude == null
                  ? LatLng(23.022505, 72.571365)
                  : LatLng(latitude, longitude)),
          mapType: MapType.normal,
          markers: Set<Marker>.of(_markers),
          onMapCreated: _onMapCreated,
          myLocationEnabled: true,
        )

【讨论】:

    【解决方案2】:

    您总是使用单个 markerId,这意味着您正在用下一个标记覆盖前一个标记,这就是为什么总是只有一个。

    对于动态标记列表,您必须传递动态markerId。看,修改后的代码如下:

    void firebaseRead() {
        databaseRef.child('Locations').onValue.listen((Event event) {
            myList = event.snapshot.value;
            setState(() {
                for (int x = 0; x < myList.length; x++) {
                  double latitude = myList[x]['lat'];
                  double longitude = myList[x]['long'];
                  LatLng location = new LatLng(latitude, longitude);
                  if (list.contains(location)) {
                     list.clear();
                      list.add(location);
                  } else {
                      list.add(location);
                  }
    
                  //Passing a dynamic marker id as the index here.
                  addMarker(list[x], x);
                }
            });
        });
        //print(list);
    }
    
    //Adding Index here as an argument
    void addMarker(loc, index) {
        //Making this markerId dynamic
        final MarkerId markerId = MarkerId('Marker $index');
    
        final Marker marker = Marker(
           markerId: markerId,
           position: LatLng(loc.latitude, loc.longitude),
           infoWindow: InfoWindow(title: 'test'),
        );
    
        setState(() {
          // adding a new marker to map
          markers[markerId] = marker;
          //print(marker);
        });
    }
    

    在这段代码中,index 的更改取自 for 循环并传递给 markerId,所以现在,markerId 对于从 firebaseRead() 传递的每个标记都将不同。

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      相关资源
      最近更新 更多