Firebase 颤振:在刷新之前,Firestore中的项目不会显示在GridView中
我这里有一个连接到firestore后端的Flitter应用程序,我在这里面临一种奇怪的行为 当应用程序启动或我热重启时,从数据库中获取的项目会显示一秒钟,然后再次消失,我必须应用RefreshIndicator并向下拖动屏幕以刷新产品并让它们再次出现 以下是我获取项目的代码:Firebase 颤振:在刷新之前,Firestore中的项目不会显示在GridView中,firebase,flutter,gridview,google-cloud-firestore,Firebase,Flutter,Gridview,Google Cloud Firestore,我这里有一个连接到firestore后端的Flitter应用程序,我在这里面临一种奇怪的行为 当应用程序启动或我热重启时,从数据库中获取的项目会显示一秒钟,然后再次消失,我必须应用RefreshIndicator并向下拖动屏幕以刷新产品并让它们再次出现 以下是我获取项目的代码: Future<void> fetchitems() async { try { final List<Product> loadedProducts = []; final
Future<void> fetchitems() async {
try {
final List<Product> loadedProducts = [];
final response = await Firestore
.instance
.collection("products")
.getDocuments();
response.documents.forEach((element) {
loadedProducts.add(Product(
id: element.documentID,
title: element.data['title'],
description: element.data['description'],
price: element.data['price'],
imageUrl: element.data['imageUrl']
));
});
_items = loadedProducts;
notifyListeners();
} catch (error) {
print(error);
}
}
Future fetchitems()异步{
试一试{
加载产品的最终列表=[];
最终响应=等待Firestore
.例如
.收集(“产品”)
.getDocuments();
response.documents.forEach((元素){
loadedProducts.add(产品)(
id:element.documentID,
标题:element.data['title'],
description:element.data['description'],
price:element.data['price'],
imageUrl:element.data['imageUrl']
));
});
_项目=装载的产品;
notifyListeners();
}捕获(错误){
打印(错误);
}
}
以下是GridView及其接收项目的方式:
Widget build(BuildContext context) {
final productsData = Provider.of<Products>(context);
final products = productsData.items;
return GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: products.length,
itemBuilder: (ctx, i) => ChangeNotifierProvider.value(
value: products[i],
child: ProductItem(),
),
小部件构建(构建上下文){
最终产品数据=提供者(上下文);
最终产品=产品数据项;
返回GridView.builder(
填充:常数边集全部(10.0),
itemCount:products.length,
itemBuilder:(ctx,i)=>ChangeNotifierProvider.value(
价值:产品[i],
子项:ProductItem(),
),
这里是我称之为GridView的地方:
class _ProductsOverviewScreenState extends State<ProductsOverviewScreen> {
var _isIntit = true;
var _isLoading = false;
Future<void> _refreshProducts(BuildContext context) async {
await Provider.of<Products>(context).fetchAndSetProducts();
}
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
if (_isIntit) {
setState(() {
_isLoading = true;
});
Provider.of<Products>(context).fetchitems().then((_) {
setState(() {
_isLoading = false;
});
});
}
_isIntit = false;
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: _isLoading ? Center(child: CircularProgressIndicator(), ) : RefreshIndicator(
onRefresh: () => _refreshProducts(context),
child: ProductsGrid()),
);
}
}
class\u productsoverviewscrenstate扩展状态{
var _isIntit=真;
var_isLoading=false;
未来刷新产品(BuildContext上下文)异步{
等待Provider.of(context.fetchAndSetProducts();
}
@凌驾
void initState(){
super.initState();
}
@凌驾
void didChangeDependencies(){
如果(不存在){
设置状态(){
_isLoading=true;
});
Provider.of(context.fetchitems()。然后((){
设置状态(){
_isLoading=false;
});
});
}
_isIntit=假;
super.didChangeDependencies();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:_isLoading?中心(子项:CircularProgressIndicator(),):刷新指示器(
onRefresh:()=>\u refreshProducts(上下文),
子项:ProductsGrid()),
);
}
}
final productsData=Provider.of(上下文,listen:false);
listen:false
确保生成不会在同一个生成中再次触发。此代码不是问题,您可以显示如何在GridView中使用_项我为GridView添加了代码以及它如何接收项我已经尝试并设置了listen:false,但仍然面临相同的问题从您调用此小部件的位置,告诉我这段代码。我在我称之为ProductsGrid的地方添加了。尝试删除RefreshIndicator并直接添加ProductsGrid(),看看它是否有效?然后我们可以找到其他一些问题。问题在于加载,它没有返回正确的bool,添加打印语句或调试,看看有什么问题
final productsData = Provider.of<Products>(context, listen: false);