android - Flutter - 一段时间后自动刷新地图上的标记图标
问题描述
我有一些标记,标记的图标会根据 firebase 字段(称为状态)而变化。status 是一个布尔值(真/假)。数据库中的此状态值经常由外部应用程序更改,因此我需要能够根据字段的当前值更新图标。如何自动更新 UI 上的标记?
这是我的代码:
BitmapDescriptor customFreeLotIcon, customOccupiedLotIcon;
Future<List<Marker>> _createMarkersForLotsAndParkings() async{
List<Marker> markersList = [];
int markerId = 0;
QuerySnapshot subDocuments = await parkingDocReference.collection("lots").get();
List<DocumentSnapshot> subDocumentsSnapshots = subDocuments.documents;
for (DocumentSnapshot subDoc in subDocumentsSnapshots){
String subDocId = subDoc.documentID;
DocumentSnapshot snapshot = await parkingDocReference.collection("lots")
.document(subDocId).get();
print(snapshot.get('location').latitude);
markersList.add(
Marker(
markerId:MarkerId(markerId.toString()),
position: LatLng(snapshot.get('location').latitude,
snapshot.get('location').longitude),
onTap: () => _changeMap(LatLng(
snapshot.get('location').latitude,
snapshot.get('location').longitude)),
icon: snapshot.get('status') == true ? customOccupiedLotIcon : customFreeLotIcon ),
);
markerId++;
}
}
return Future.value(markersList);
}
createCustomImageForParkingsMarkers(context){
if (customFreeLotIcon == null) {
ImageConfiguration configuration = createLocalImageConfiguration(context);
BitmapDescriptor.fromAssetImage(configuration, 'assets/freeLots.png')
.then((icon) {
setState(() {
customFreeLotIcon = icon;
});
});
}
else if (customOccupiedLotIcon == null) {
ImageConfiguration configuration = createLocalImageConfiguration(context);
BitmapDescriptor.fromAssetImage(configuration, 'assets/occupiedLots.png')
.then((icon) {
setState(() {
customOccupiedLotIcon = icon;
});
});
}
}
解决方案
尝试添加一个监听器:
BitmapDescriptor customFreeLotIcon, customOccupiedLotIcon;
Future<List<Marker>> _createMarkersForLotsAndParkings() async{
List<Marker> markersList = [];
int markerId = 0;
QuerySnapshot subDocuments = await parkingDocReference.collection("lots").get();
List<DocumentSnapshot> subDocumentsSnapshots = subDocuments.documents;
for (DocumentSnapshot subDoc in subDocumentsSnapshots){
String subDocId = subDoc.documentID;
DocumentSnapshot snapshot = await parkingDocReference.collection("lots")
.document(subDocId).snapshots()
.listen((DocumentSnapshot documentSnapshot) async {
Map<String, dynamic> document = documentSnapshot.data();
print(document['location'].latitude);
markersList.add(
Marker(
markerId:MarkerId(markerId.toString()),
position: LatLng(document['location'].latitude,
document['location'].longitude),
onTap: () => _changeMap(LatLng(
document['location'].latitude,
document['location'].longitude)),
icon: document['status'] == true ? customOccupiedLotIcon : customFreeLotIcon ),
);
markerId++;
}
}
}
return Future.value(markersList);
}
createCustomImageForParkingsMarkers(context){
if (customFreeLotIcon == null) {
ImageConfiguration configuration = createLocalImageConfiguration(context);
BitmapDescriptor.fromAssetImage(configuration, 'assets/freeLots.png')
.then((icon) {
setState(() {
customFreeLotIcon = icon;
});
});
}
else if (customOccupiedLotIcon == null) {
ImageConfiguration configuration = createLocalImageConfiguration(context);
BitmapDescriptor.fromAssetImage(configuration, 'assets/occupiedLots.png')
.then((icon) {
setState(() {
customOccupiedLotIcon = icon;
});
});
}
}
在此处添加Setstate()
:
setState(() {
markersList.add(
Marker(
markerId:MarkerId(markerId.toString()),
position: LatLng(document['location'].latitude,
document['location'].longitude),
onTap: () => _changeMap(LatLng(
document['location'].latitude,
document['location'].longitude)),
icon: document['status'] == true ? customOccupiedLotIcon : customFreeLotIcon ),
);
markerId++;
});
推荐阅读
- spring - 使用 Spring Data Paging 确保当前页面是最后一个页面的方法
- python - TensorFlow Serving 客户端批处理
- file - 是否可以使用重定向运算符将输出重定向到文件而不在 Powershell 中写入字节顺序标记?
- sql - Redshift - 查找特定值存储在表中的列中的次数
- python - 基维虫?按钮的启用/禁用属性似乎没有更新,它只关心该字段是否存在并且不等于 0
- java - 重复定义字符串常量会占用更多内存吗?
- reactjs - Material-UI v1:如何为 material-ui v1 中的所有组件设置一个字体大小?
- android - 如何从 Android 向 Azure IoT Hub 发送 SMS
- ansible - 动态构建变量
- javascript - Jquery TokenInput 初始字符串搜索