Google maps 导航到谷歌地图';通过单击Flatter应用程序中的卡小部件创建位置标记

Google maps 导航到谷歌地图';通过单击Flatter应用程序中的卡小部件创建位置标记,google-maps,flutter,Google Maps,Flutter,我想设计一张卡,当点击它时,它将导航到指定的标记 我从CloudFireStore获取了我的坐标(标记)。一切都很完美。但当我尝试使用pageview.builder将我的标记与卡片链接时,它失败了。 我已经连接并从firebase:firestore获取所有标记。我唯一的问题是我无法连接我的标记。 也许在代码的末尾,我使用了“Future”来指定相机在导航时的移动,并且在pageview.builder之外使用了它 import 'package:cloud_firestore/cloud

我想设计一张卡,当点击它时,它将导航到指定的标记

我从CloudFireStore获取了我的坐标(标记)。一切都很完美。但当我尝试使用pageview.builder将我的标记与卡片链接时,它失败了。

我已经连接并从firebase:firestore获取所有标记。我唯一的问题是我无法连接我的标记。 也许在代码的末尾,我使用了“Future”来指定相机在导航时的移动,并且在pageview.builder之外使用了它

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:permission/permission.dart';

class Metro extends StatefulWidget {
  @override
  _MetroState createState() => _MetroState();
}
String stations;
class _MetroState extends State<Metro> {
  // GoogleMapController _controller;
  // final CameraPosition _initialPosition = CameraPosition(target: LatLng(9.0131, 38.7240), zoom: 17.0);

  LatLng _initialPosition = LatLng(9.0131, 38.7240);
  GoogleMapController _controller;
  Location _location= Location();

  int prevPage;

  PageController _pageController;

  void _onMapCreated(GoogleMapController _cntrl){
    _controller = _cntrl;
    _location.onLocationChanged.listen((l) {
      _controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(target: LatLng(l.latitude, l.longitude), zoom: 15)));
    });
  }

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

  void initMarker(specify, specifyId) async {
    var markerIdVal = specifyId;
    final MarkerId markerId = MarkerId(markerIdVal);
    final Marker marker = Marker(
      markerId: markerId,
      draggable: false,
      position:
      LatLng(specify['Location'].latitude, specify['Location'].longitude),
      infoWindow: InfoWindow(title: specify['Name'], snippet: 'Station'),
    );
    setState(() {
      markers[markerId] = marker;
    },
    );
    _pageController = PageController(initialPage: 0, viewportFraction: 0.8)..addListener(_onScroll);
  }

  void _onScroll() {
    if (_pageController.page.toInt() != prevPage) {
      prevPage = _pageController.page.toInt();
      moveCamera();
    }
  }



  getMarkerData() async {
    Firestore.instance.collection('route 1 markers').getDocuments().then((myMockDoc) {
      if (myMockDoc.documents.isNotEmpty) {
        for (int i = 0; i < myMockDoc.documents.length; i++) {
          initMarker(myMockDoc.documents[i].data, myMockDoc.documents[i].documentID);
        }
      }
    }
    );
  }

  @override
  void initState() { enter code here
    getMarkerData();
    super.initState();
  }

   

  @override
  Widget build(BuildContext context) {
    Set<Marker> getMarker() {
      return <Marker>[
        Marker(
            markerId: MarkerId('Station'),
            position: _initialPosition,
            icon: BitmapDescriptor.defaultMarker,
            infoWindow: InfoWindow(title: 'Home'))
      ].toSet();
    }
    return Scaffold(
      // floatingActionButton: FloatingActionButton(
      //   onPressed: (){},
      //   backgroundColor: Colors.lightGreen,
      //   child: Icon(Icons.search),
      // ),
      body: Stack(
        children: [
          GoogleMap(
            markers: Set<Marker>.of(markers.values),
            mapType: MapType.normal,
            initialCameraPosition: CameraPosition(target: _initialPosition, zoom: 25),
            onMapCreated: _onMapCreated,
            myLocationEnabled: true,
            myLocationButtonEnabled: true,
            mapToolbarEnabled: false,

          ),
          Positioned(
              bottom: 20.0,
              child: Container(
                height: 200,
                width: MediaQuery.of(context).size.width,
                child: StreamBuilder<QuerySnapshot>(
                  stream: Firestore.instance.collection('route 1 markers').snapshots(),
                  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                    if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
                    switch (snapshot.connectionState) {
                      case ConnectionState.waiting:
                        return new Text('Loading...');
                      default:
                        return PageView.builder( // Changes begin here
                            controller: _pageController,
                            scrollDirection: Axis.horizontal,
                            itemCount: snapshot.data.documents.length,
                            itemBuilder: (context, index) {
                              final document = snapshot.data.documents[index];

                              return AnimatedBuilder(
                                animation: _pageController,
                                builder: (BuildContext context, Widget widget){
                                  double value = 1;
                                  if (_pageController.position.haveDimensions) {
                                    value = _pageController.page - index;
                                    value = (1 - (value.abs() * 0.3) + 0.06).clamp(0.0, 1.0);
                                  }
                                  return Center(
                                    child: SizedBox(
                                      height: Curves.easeInOut.transform(value) * 125.0,
                                      width: Curves.easeInOut.transform(value) * 350.0,
                                      child: widget,
                                    ),
                                  );
                                },
                                child: InkWell(
                                  onTap: (){moveCamera();},
                                  child: Stack(
                                    children: [
                                      Center(
                                        child: Container(
                                          margin: EdgeInsets.symmetric(
                                              horizontal: 10.0,
                                              vertical: 20.0
                                          ),
                                          height: 125,
                                          width: 270,
                                          decoration: BoxDecoration(
                                              borderRadius: BorderRadius.circular(10.0),
                                              boxShadow: [
                                                BoxShadow(
                                                  color: Colors.black54,
                                                  offset: Offset(0.0, 4.0),
                                                  blurRadius: 10.0,
                                                ),
                                              ]),
                                          child: Container(
                                            decoration: BoxDecoration(
                                                borderRadius: BorderRadius.circular(10.0),
                                                color: Colors.white
                                            ),
                                            child: Row(
                                              children: [
                                                Container(
                                                    height: 90,
                                                    width: 90,
                                                    decoration: BoxDecoration(
                                                        borderRadius: BorderRadius.only(
                                                            bottomLeft: Radius.circular(10.0),
                                                            topLeft: Radius.circular(10.0)),
                                                        image: DecorationImage(
                                                            image: NetworkImage(
                                                                document['img']),
                                                            fit: BoxFit.cover))),
                                                SizedBox(width: 5.0),
                                                Column(
                                                  crossAxisAlignment: CrossAxisAlignment.start,
                                                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                                                  children: [
                                                    Text(
                                                      document['Name'],
                                                      style: TextStyle(
                                                          fontSize: 15,
                                                          fontWeight: FontWeight.bold),
                                                    ),
                                                    Positioned(
                                                      bottom: 5.0,
                                                      child: Text(
                                                        "Addis Ababa, Ethiopia",
                                                        style: TextStyle(
                                                            fontSize: 13.0,
                                                            fontWeight: FontWeight.w600),
                                                      ),
                                                    ),
                                                    Container(
                                                      width: 170,
                                                      child: Text(
                                                        document['Detail'],
                                                        style: TextStyle(
                                                            fontSize: 12.0,
                                                            fontWeight: FontWeight.w300),
                                                      ),
                                                    ),
                                                  ],
                                                )
                                              ],
                                            ),
                                          ),
                                        ),
                                      )
                                    ],
                                  ),
                                ),
                              );

                            }
                        );
                    }
                  },
                ),
              ))
        ],
      ),
    );
  }

    Future<void> moveCamera() async{
      _controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
        target: document[_pageController.page.toInt()].Location,
        zoom: 14.0,
        tilt: 45.0,
        bearing: 45.0,
      )));
    }
}
import'包:cloud_firestore/cloud_firestore.dart';
进口“包装:颤振/材料.省道”;
导入“包:google_-maps_-flatter/google_-maps_-flatter.dart”;
导入“package:location/location.dart”;
导入“package:permission/permission.dart”;
类Metro扩展StatefulWidget{
@凌驾
_MetroState createState();
}
弦乐台;
类_MetroState扩展状态{
//GoogleMapController\u控制器;
//最终摄像机位置_initialPosition=摄像机位置(目标:LatLng(9.0131,38.7240),缩放:17.0);
LatLng _initialPosition=LatLng(9.0131,38.7240);
GoogleMapController\u控制器;
位置_位置=位置();
整版前页;
页面控制器_页面控制器;
已创建void(谷歌地图控制器){
_控制器=_cntrl;
_location.onLocationChanged.listen((l){
_controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition)(目标:纬度,经度,缩放:15));
});
}
地图标记={};
void initMarker(指定,specifyId)异步{
var markerIdVal=specifiyid;
最终MarkerId MarkerId=MarkerId(markerIdVal);
最终标记=标记(
马克里德:马克里德,
可拖动:错误,
职位:
纬度(指定['Location'].纬度,指定['Location'].经度),
infoWindow:infoWindow(标题:指定['Name'],代码段:'Station'),
);
设置状态(){
markers[markerId]=标记器;
},
);
_pageController=pageController(初始页:0,viewportFraction:0.8)…添加侦听器(\u onScroll);
}
void _onScroll(){
如果(_pageController.page.toInt()!=prevPage){
prevPage=\u pageController.page.toInt();
移动摄像机();
}
}
getMarkerData()异步{
Firestore.instance.collection('route 1 markers').getDocuments().then((myMockDoc){
if(myMockDoc.documents.isNotEmpty){
对于(int i=0;i