如何在加载数据时等待或重建消费者

How to await or rebuild Consumer when data is loaded

如何在加载数据或等待数据加载时重新加载消费者。我正在使用 Future Provider 并且在加载数据(已获取 currentPosition)并在等待时使用 circularProgress() 时,一切都会自行重建。但是消费者并没有重建自己,因为它不能将 await 与消费者包一起使用。当我在热重载时调试时保存代码时一切正常,但这不是一个解决方案。我希望消费者在获取数据时自动重新加载。我正在获取数据以在 google_Maps_Flutter

上做标记
body: (currentPosition != null)
        ? Consumer<List<Bar>>(builder: (_, places, child) {
            List.generate(places.length, (index) async {
              print(places.length);
              print(index);
              print(imageUrl(places[index].photoRef));
              List<String> wordList = places[index].name.split(" ");

              bitmapIcon = await customBitmapDescriptor(
                imageUrl: imageUrl(places[index].photoRef),
                title: wordList[0],
              );
              markers = markerService.getBarMarkers(
                places,
                markerIcon: this.bitmapIcon,
              );
              print(markers.isEmpty);
            });

加载数据时使用setState((){});重建。在要重建的地方添加 setState((){});,例如如果要在 bitmapIcon 中加载数据时重新加载,请添加

bitmapIcon = await convertImageFileToCustomBitmapDescriptor(
                          imageUrl: imageUrl(places[index].photoRef),
                          title: wordList[0],
                        ).then((value) {
                          setState(() {});
                        });

如果您想在标记中加载数据时重新加载,请使用

setState(() {
              markers = markerService.getBarMarkers(
                            places,
                            markerIcon: this.bitmapIcon,
                          );
                        });

第一个场景

body: (currentPosition != null)
    ? Consumer<List<Bar>>(builder: (_, places, child) {
        List.generate(places.length, (index) async {
          print(places.length);
          print(index);
          print(imageUrl(places[index].photoRef));
          List<String> wordList = places[index].name.split(" ");

          bitmapIcon =await convertImageFileToCustomBitmapDescriptor(
                          imageUrl: imageUrl(places[index].photoRef),
                          title: wordList[0],
                        ).then((value) {
                          setState(() {});
                        });
          markers = markerService.getBarMarkers(
            places,
            markerIcon: this.bitmapIcon,
          );
          print(markers.isEmpty);
        });

第二种情况

body: (currentPosition != null)
    ? Consumer<List<Bar>>(builder: (_, places, child) {
        List.generate(places.length, (index) async {
          print(places.length);
          print(index);
          print(imageUrl(places[index].photoRef));
          List<String> wordList = places[index].name.split(" ");

          bitmapIcon = await convertImageFileToCustomBitmapDescriptor(
                          imageUrl: imageUrl(places[index].photoRef),
                          title: wordList[0],
                        );
        if(!isSet){
          setState(() {
                          markers = markerService.getBarMarkers(
                            places,
                            markerIcon: this.bitmapIcon,
                          );
                        });
         }
          print(markers.isEmpty);
        });

如果此解决方案有帮助,请点赞

使用notifyListener()你可以改变消费者的状态。

下面是一个示例代码。如果您需要更多,请告诉我。

Consumer<DataProviderClass>(
                builder: (context, portfolioProvider, _) {
                print("state changed");
                
                return RaisedButton(
                child: Text("Press"),
                onPressed : () =>  
                   Provider.of<DataProviderClass(context).fetchData(),
                  );
                }
);


                
                
                
class DataProviderClass with ChangeNotifier{
    fetchData(){
      notifyListener();
    }
}