【问题标题】:Load markers dynamically in flutter from another screen从另一个屏幕动态加载标记
【发布时间】:2020-06-22 02:30:33
【问题描述】:

屏幕 A 包含一个谷歌地图,该地图有一个按钮,可以将用户导航到另一个屏幕(屏幕 B),他们可以在其中输入坐标。这些坐标存储在 Firestore 中,用于在地图上构建标记。然后按下屏幕 B 上的返回按钮。我希望地图显示新标记。我可以使用按钮在地图屏幕上调用setState(),但我不想这样做。我也在考虑使用 Streambuilder,但不确定如何使用标记类作为GoogleMap() 的属性来实现它。有什么建议吗? 这是我的代码:

class PlacesMap extends StatefulWidget {
  @override
  State<PlacesMap> createState() => PlacesMapState();
}

class PlacesMapState extends State<PlacesMap> {

  GoogleMapController _mapController;
  Map<MarkerId, Marker> _markers = <MarkerId, Marker>{};

  @override
  void initState() {
    super.initState();
    _updateMarkers());
  }

  void _onMapCreated(GoogleMapController controller) {
    _updateMarkers();
    setState(() {
      _mapController = controller;
    });
  }

  void _updateMarkers() async {
    QuerySnapshot querySnapshot =
        await Firestore.instance.collection('position').getDocuments();
    List<DocumentSnapshot> documentList = querySnapshot.documents;
    _markers.clear();
    documentList.forEach((DocumentSnapshot document) {
      GeoPoint pos = document.data['geopoint'];
      print(pos.latitude.toString());
      print(pos.longitude.toString());
      String markerIdVal = document.documentID;

      final MarkerId markerId = MarkerId(markerIdVal);
      final Marker marker = Marker(
        markerId: markerId,
        position: LatLng(pos.latitude, pos.longitude),
      );

      setState(() {
        _markers[markerId] = marker;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Stack(children: [
      GoogleMap(
        initialCameraPosition:
            CameraPosition(target: LatLng(43.651070, -79.347015), zoom: 10),
        onMapCreated: _onMapCreated,
        compassEnabled: true,
        markers: Set<Marker>.of(_markers.values),
      ),
      Positioned(
        left: 100,
        bottom: 100,
        right: 100,
        child: RaisedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AddressForm()),
            );
          },
          color: Colors.red,
          child: Text(
            'POST YOUR ADD',
            style: TextStyle(color: Colors.white),
          ),
        ),
      )
    ]);
  }
}

【问题讨论】:

  • 如果您想从另一个 Route 获取结果,请检查 Navigator.push() 方法返回的内容

标签: flutter google-cloud-firestore maps


【解决方案1】:

感谢@pskink 引导我找到答案。我能够使用来自Navigator.push() 的返回调用setState() 来更新地图屏幕上的标记

Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AddressForm()),
            ).then((value){
              setState(() {
            _updateMarkers();
              });
            }

【讨论】:

  • 但老实说有点奇怪,因为您不使用从子页面传递的value...
  • 返回值为空。而且我不使用它。但我不知道我还能怎么打电话给setState
  • 好吧,我错过了那部分:“这些坐标存储在 Firestore 中,用于在地图上构建标记。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多