Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 颤振:在刷新之前,Firestore中的项目不会显示在GridView中_Firebase_Flutter_Gridview_Google Cloud Firestore - Fatal编程技术网

Firebase 颤振:在刷新之前,Firestore中的项目不会显示在GridView中

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

我这里有一个连接到firestore后端的Flitter应用程序,我在这里面临一种奇怪的行为

当应用程序启动或我热重启时,从数据库中获取的项目会显示一秒钟,然后再次消失,我必须应用RefreshIndicator并向下拖动屏幕以刷新产品并让它们再次出现

以下是我获取项目的代码:

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