firebase - Flutter web无法从firestore获取数据

标签 firebase flutter google-cloud-firestore flutter-web

我在从 firestore 获取数据时遇到问题,代码如下:-

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:machineweb/model/models.dart';



class ProductArgs {
  String crop;
  ProductArgs({this.crop});
}

class ShowProduct extends StatefulWidget {
  static String route = '\showproductroute';
  @override
  _ShowProductState createState() => _ShowProductState();
}

class _ShowProductState extends State<ShowProduct> {
  @override
  Widget build(BuildContext context) {
    double screenWidthSize = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;
    ProductArgs args = ModalRoute.of(context).settings.arguments;

    FirebaseFirestore firestore = FirebaseFirestore.instance;

    List<DocumentSnapshot> products = []; // stores fetched products

    bool isLoading = false; // track if products fetching

    bool hasMore = true; // flag for more products available or not

    int documentLimit = 2; // documents to be fetched per request

    DocumentSnapshot
        lastDocument; // flag for last document from where next 10 records to be fetched

    ScrollController _scrollController = ScrollController();

    print(args.crop);

    getProducts() async {
      if (!hasMore) {
        print('No More Products');
        return;
      }
      if (isLoading) {
        return;
      }
      setState(() {
        isLoading = true;
      });
      QuerySnapshot querySnapshot;
      if (lastDocument == null) {
        querySnapshot = await firestore
            .collection('productData')
            .where('type', isEqualTo: args.crop)
            .limit(documentLimit)
            .get();
      } else {
        querySnapshot = await firestore
            .collection('productData')
            .where('type', isEqualTo: args.crop)
            .startAfterDocument(lastDocument)
            .limit(documentLimit)
            .get();
        print(1);
      }
      if (querySnapshot.docs.length < documentLimit) {
        hasMore = false;
      }
      lastDocument = querySnapshot.docs[querySnapshot.docs.length - 1];
      products.addAll(querySnapshot.docs);
      setState(
        () {
          isLoading = false;
        },
      );
    }

    _scrollController.addListener(
      () {
        double maxScroll = _scrollController.position.maxScrollExtent;
        double currentScroll = _scrollController.position.pixels;
        double delta = MediaQuery.of(context).size.height * 0.20;
        if (maxScroll - currentScroll <= delta) {
          getProducts();
        }
      },
    );

    int _crossAxisCount = 0;

    if (screenWidthSize > 720) {
      _crossAxisCount = 3;
    } else if (screenWidthSize > 520) {
      _crossAxisCount = 2;
    } else {
      _crossAxisCount = 1;
    }

    print(products.length.toString());

    return Container(
      child: Column(children: [
        Expanded(
          child: products.length == 0
              ? Center(
                  child: Text('No Data...'),
                )
              : ListView.builder(
                  controller: _scrollController,
                  itemCount: products.length,
                  itemBuilder: (context, index) {
                    return ListTile(
                      contentPadding: EdgeInsets.all(5),
                      title: Text(products[index].data()['name']),
                      subtitle: Text(products[index].data()['short_desc']),
                    );
                  },
                ),
        ),
        isLoading
            ? Container(
                width: MediaQuery.of(context).size.width,
                padding: EdgeInsets.all(5),
                color: Colors.yellowAccent,
                child: Text(
                  'Loading',
                  textAlign: TextAlign.center,
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                  ),
                ),
              )
            : Container()
      ]),
    );
  }
}
即使 firestore 上有数据,

products.lenght 也为零。

这是我的index.html:-

  <script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-firestore.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-analytics.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.3.1/firebase-storage.js"></script>

甚至尝试将其更改为:-

<script src="https://www.gstatic.com/firebasejs/7.20.0/firebase-storage.js"></script>

如何从 firestore 获取数据,我尝试使用其他软件包,即使不起作用。

有什么解决方案吗,有很多类似的问题,但不是通过问题来解决?

最佳答案

这可能是因为您忘记添加 Firestore 规则以允许从您的集合中进行提取。我建议您检查一下获取快照是否出错。您可以通过添加到代码中来做到这一点:

if (snapshot.hasError) { print(snapshot.error.toString()) }

关于firebase - Flutter web无法从firestore获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67173175/

相关文章:

android - 如何为firebase数据库中的所有子数据设置值?

flutter - 当我在Firestore中更新数据时,更新数据功能不起作用?

dart - Flutter NotificationListener with ScrollNotification vs ScrollController

typescript - 从 QuerySnapshot 获取数据

java - 如何正确构造 Java 代码以将命名键下的值保存到 Firebase 实时数据库

reactjs - Firebase Firestore onSnapshot PayloadTooLargeError : request entity too large on Expo/React Native project

flutter - flutter 中的多个依赖下拉列表

javascript - 以 Angular 检索单个 firestore 文档

javascript - 无法修改已提交 FireStore 的 WriteBatch

javascript - Firebase 云功能在部署时未更新 - 仍在提供旧版本的功能