如何在加载数据时等待或重建消费者
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();
}
}
如何在加载数据或等待数据加载时重新加载消费者。我正在使用 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();
}
}