【问题标题】:How to retrive my markers from Firestore to Google Map?如何将我的标记从 Firestore 检索到 Google Map?
【发布时间】:2020-12-26 21:17:29
【问题描述】:

自从 Firebase 进行重大更新后,我就陷入了困境。我无法将我的标记从 Firestore 显示到 Google 地图。

以前,它有效。我不明白我的代码有什么问题。

运行代码时出现此错误:

E/flutter ( 8450): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: Closure call with mismatched arguments: function 'data'
E/flutter ( 8450): Receiver: Closure: () => Map<String, dynamic> from Function 'data':.
E/flutter ( 8450): Tried calling: data()
E/flutter ( 8450): Found: data() => Map<String, dynamic>

代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';

class NewMap extends StatefulWidget {
  @override
  _NewMapState createState() => _NewMapState();
}

class _NewMapState extends State<NewMap> {
  GoogleMapController _controller;

  Position position;

  Widget _child;

  Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
  BitmapDescriptor pinLocationIcon;

  @override
  void initState() {
    _child = SpinKitRipple(
      itemBuilder: (BuildContext context, int index) {
        return DecoratedBox(
          decoration: BoxDecoration(
            color: index.isEven ? Colors.grey : Color(0xffffb838),
          ),
        );
      },
    );
    getCurrentLocation();
    populateClients();
    setCustomMapPin();
    super.initState();
  }

  void getCurrentLocation() async {
    Position res = await getCurrentPosition();
    setState(() {
      position = res;
      _child = mapWidget();
    });
  }

  populateClients() {
    FirebaseFirestore.instance.collection("AllTombs").get().then((docs) {
      if (docs.docs.isNotEmpty) {
        for (int i = 0; i < docs.docs.length; ++i) {
          initMarker(docs.docs[i].data, docs.docs[i].id);
        }
      }
    });
  }

  void initMarker(tomb, tombId) {
    var markerIdVal = tombId;
    final MarkerId markerId = MarkerId(markerIdVal);

    final Marker marker = Marker(
      markerId: markerId,
      position: LatLng(
          tomb.data()['location'].latitude, tomb.data()['location'].latitude),
      icon: pinLocationIcon,
    );
    setState(() {
      markers[markerId] = marker;
    });
  }

  void setCustomMapPin() async {
    pinLocationIcon = await BitmapDescriptor.fromAssetImage(
        ImageConfiguration(devicePixelRatio: 2.5), 'assets/icon/pin.png');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        iconTheme: IconThemeData(color: Color(0xffffb838)),
        centerTitle: true,
        backgroundColor: Colors.white,
      ),
      body: _child,
    );
  }

  Widget mapWidget() {
    return Stack(
      children: <Widget>[
        GoogleMap(
            initialCameraPosition: CameraPosition(
              target: LatLng(position.latitude, position.longitude),
              zoom: 10,
            ),
            onMapCreated: (GoogleMapController controller) {
              _controller = controller;
            },
            compassEnabled: true,
            myLocationEnabled: true,
            markers: Set<Marker>.of(markers.values)),
        SizedBox(
          height: 26,
        ),
      ],
    );
  }
}

【问题讨论】:

    标签: firebase google-maps flutter dart google-cloud-firestore


    【解决方案1】:

    新版本需要使用data():

      populateClients() {
        FirebaseFirestore.instance.collection("AllTombs").get().then((docs) {
          if (docs.docs.isNotEmpty) {
            for (int i = 0; i < docs.docs.length; ++i) {
              initMarker(docs.docs[i].data(), docs.docs[i].id);
            }
          }
        });
      }
    

    【讨论】:

    • 非常感谢您,彼得·哈巴德!它正在工作:) 当我点击 infoWindow 时,你知道如何转到详细信息页面吗?
    • @sarahpougnaud 什么infoWindow?我还没有使用谷歌地图所以不确定..但它可能只是使用导航器并将数据发送到其他页面
    • 信息窗口是当您点击您的定位销时打开的弹出窗口。但我真的很糟糕将数据发送到其他页面。在我的情况下你是怎么做到的?
    猜你喜欢
    • 2021-06-04
    • 2021-08-25
    • 2020-07-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多