Flutter-一段时间后自动刷新地图上的标记图标

问题描述

我有一些标记,并且标记的图标根据火力场字段(称为状态)而变化。 status是个布尔值(对/错)。此状态值经常由外部应用程序在数据库中更改,因此我需要能够根据字段的当前值来更新图标。如何自动新用户界面上的标记

这是我的代码

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;
        });
      });
    }
  }

解决方法

尝试添加侦听器:

function max(a,b) {
  return Animated.multiply(
    0.5,Animated.add(Animated.add(a,b),abs(Animated.subtract(a,b)))
  );
};

function min(a,Animated.subtract(Animated.add(a,b)))
  );
};

在此处添加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()