【发布时间】:2021-05-07 23:37:38
【问题描述】:
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('map').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['location'].latitude, tomb['location'].longitude),
icon: pinLocationIcon,
);
setState(() {
markers[markerId] = marker;
});
}
void setCustomMapPin() async {
pinLocationIcon = await BitmapDescriptor.fromAssetImage(
ImageConfiguration(devicePixelRatio: 2.5), 'assets/images/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,
),
markers: Set<Marker>.of(markers.values),
onMapCreated: (GoogleMapController controller) {
_controller = controller;
},
compassEnabled: true,
myLocationEnabled: true,
),
SizedBox(
height: 26,
),
],
);
}
}
这是我的代码,当我尝试在控制台上打印 lat long 值时,会从 firestore 中读取这些值。 地图正在正确显示当前位置也正在显示。 据我了解,标记已创建,因为我可以将 lat long 打印到控制台 但是标记没有显示在地图上。
我该如何解决这个问题
【问题讨论】:
-
代码看起来不错;不确定这是否有帮助,您是否尝试过直接在 Scaffold 中调用
mapWidget(),例如body: mapWidget() -
设置在getCurrentLocation
_child = mapWidget(); -
是的,我注意到了;但
setState()仅重新运行 build() 方法。因为 _child 是一个类成员并且在 initState() 中分配,所以想试一试; -
这是由于
flutter clean显示后的记忆,非常感谢您的帮助和时间 -
太好了,你修好了!你能发表你的答案吗?以便对其他观众有所帮助。
标签: flutter google-maps google-cloud-firestore google-maps-markers