首页 > 解决方案 > Flutter如何以另一种方法从Firestore传入documents.length?

问题描述

我有一个采用值的方法int,该值应该是Cloud Firestore集合文档array字段长度的值。

我对 Flutter 尤其是 Firestore 都很陌生,我认为这与期货、查询和流的工作方式有关,但我似乎无法正确理解它。

这就是我想要实现的目标:

class UserBookmarksSection extends StatefulWidget {
  @override
  _UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}

class _UserBookmarksSectionState extends State<UserBookmarksSection> {  
  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,      
      children: <Widget>[
        HeadlineItem(title: "Your bookmarks"), 
        StreamBuilder(
          stream: Firestore.instance.collection("brites").snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) return const Text("Loading...");
            return Column(
              children: populateBriteList(snapshot, x, true), //Here I want to pass in the length of the array in firestore into x
            );
          }
        ),
      ],
    );
  }
}

基本上,我尝试创建一个返回 aFuture<int>并尝试传递它的方法,但这不起作用,因为 aFuture<int>int. 我明白,但解决方案对我来说并不清楚。

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


我不确定 brites 和书签之间的关系——也就是说,你希望更频繁地改变它。我将假设一旦用户打开书签部分,书签就不会改变。

如果是这种情况,您可以在 initState 中检索书签长度值。您将覆盖状态类的 initState() 方法,然后调用从数据库中检索值的异步方法。(初始化状态本身不能是异步的)。检索到值后,您可以调用 setState() 以使用设置为 int 的书签值更新小部件。

可能看起来像这样:

class UserBookmarksSection extends StatefulWidget {
  @override
  _UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}

class _UserBookmarksSectionState extends State<UserBookmarksSection> {  
  int bookmarksLength;

  @override
  void initState(){
    super.initState();
    getBookmarksLength();
  }

  Future<void> getBookmarksLength() async {
    bookmarksLength = await getArrayLength(id);
    setState((){});
  }

  @override
  Widget build(BuildContext context) {
    if(bookmarksLength == null) return CircularProgressIndicator();
    else return Column(
      crossAxisAlignment: CrossAxisAlignment.start,      
      children: <Widget>[
        HeadlineItem(title: "Your bookmarks"), 
        StreamBuilder(
          stream: Firestore.instance.collection("brites").snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) return const Text("Loading...");
            return Column(
              children: populateBriteList(snapshot, bookmarksLength, true), 
            );
          }
        ),
      ],
    );
  }
}


Firestore firestore = Firestore.instance;

Future<int> getArrayLength(String documentId) async {
  DocumentSnapshot snapshot = await firestore.collection('collection').document(documentId).get();
  return snapshot.data['array'].length;
}

一个更强大的解决方案可能是有一个单独的类来处理侦听流和检索数组的长度,然后将您要显示的所有信息组合成一些抽象数据类型,然后将其放入单独的您指定的专门供 UI 收听的流。


推荐阅读