android - Flutter Future 构建器,future 被多次调用
问题描述
问题:我在SingleChildScrollView内的Column中有一个未来的构建器,
它多次调用它的未来(无限)。
FutureBuilder(
future: ProductLoaderUtil.getSimilarProducts(
context, widget.productItem.productCategoryId),
builder: (context, val) {
if (val.hasData && (!val.hasError))
return ListProductHorizontal(
productItemsHorizontal: val.data,
flag: false,
);
else
return Container(
height: _height * 0.06,
color: FakeWhite,
);
},
),
被调用的函数是这样的,
static Future<List<ProductItem>> getSimilarProducts(
BuildContext context, String category) async {
List<ProductItem> products = [];
String categoryName = categories[0];
debugPrint(categoryName + " --- ");
await Firestore.instance
.collection("GlobalDataBase")
.document(categoryName)
.collection("ITEMS")
.limit(4)
.getDocuments()
.then((value) {
value.documents.forEach((element) {
// debugPrint(element.data.toString());
products.add(ProductItem.fromJson(element.data));
});
});
return products;
}
解决方案
这可能是因为您使用的某个地方setState()
以及当您重新构建您的小部件树并再次FutureBuilder
调用该方法时,通过拥有这样的有状态小部件future
来防止这种访问未来的方法initState()
// inside state class...
Future getPopluarProductsFuture;
@override
void initState() {
super.initState();
getPopularProductsFuture = getPopularProducts(
context, widget.productItem.productCategoryId);
}
// now for the FutureBuilder make it like this
FutureBuilder(
future: getPopularProductsFuture,
builder: ......
)
推荐阅读
- python - Pygame Sprite Collision 仅给出 True
- cmake - CMake 对公共静态库的依赖
- git - 在源树中重命名提交消息/撤消提交并从图中删除
- json - 从 Angular5 迁移到 Angular6,angular.json 没有更新
- php - 禁止在主页上使用 htaccess 仅在一个页面上工作
- flutter - 在bottomNavigationBar下方显示bottomSheet
- azure - 通过 Release/CD 导入 AppInsight Instrumentation Key 并在应用程序的 appsettings 中更新 Instrumentation 密钥
- java - 如何在java中设置没有身份验证的smtp服务器
- java - Android允许用户在地图上只选择公交车站
- android - 听众在我的片段中不起作用