【问题标题】:Is there a way to set the childcount of a SliverList to the Firebase Collection Length?有没有办法将 SliverList 的子数设置为 Firebase 集合长度?
【发布时间】:2021-11-02 03:24:53
【问题描述】:

我的 FutureBuild 在我的 ListView 中,因此我无法访问文档长度。有什么办法吗?我想制作一个 PostsContainer 列表,我知道这有点乱,但我没有找到其他方法。

这是我的代码:

    Future getPosts() async {
      var firestore = FirebaseFirestore.instance;
      qn = await firestore.collection("Posts").get();
      qn.docs;
      count = qn.docs.length;
    }

    return Scaffold(
      backgroundColor: Colors.black,
      body: CustomScrollView(
        slivers: <Widget>[
          appBar,
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (context, index) {
                return FutureBuilder(
                  future: getPosts(),
                  builder: (_, snapshot) {
                    if(snapshot.connectionState == ConnectionState.waiting) {
                      return Center(
                        child: Text('Loading', style: TextStyle(color: Colors.white),),
                      );
                    }
                    else {
                      return PostContainer(
                        post: Post(user: UserModel(
                            imageUrl: 'https://images.ctfassets.net/hrltx12pl8hq/7yQR5uJhwEkRfjwMFJ7bUK/dc52a0913e8ff8b5c276177890eb0129/offset_comp_772626-opt.jpg?fit=fill&w=800&h=300',
                            name: qn.docs[index].get('name'),
                          ),
                          caption: qn.docs[index].get('Text') != null ? qn.docs[index].get('Text') : null,
                          timeAgo: '0 min', 
                          imageUrl: qn.docs[index].get('img') != null ? qn.docs[index].get('img') : null, 
                          likes: 6345, 
                          comments: 15, 
                          shares: 18, 
                          views: 45
                          ),
                      );
                    }
                  }
                );
              },
              childCount: count,
            )
          )
        ],
      ),
    );```

Thanks in advance!

【问题讨论】:

    标签: flutter flutter-futurebuilder


    【解决方案1】:

    试试这个

    Future getPosts() async {
          var firestore = FirebaseFirestore.instance;
          qn = await firestore.collection("Posts").get();
          qn.docs;
          count = qn.docs.length;
        }
    
        return Scaffold(
          backgroundColor: Colors.black,
          body: CustomScrollView(
            slivers: <Widget>[
              appBar,
              FutureBuilder(
                  future: getPosts(),
                  builder: (_, snapshot) {
                    if(snapshot.connectionState == ConnectionState.waiting) {
                      return Center(
                        child: Text('Loading', style: TextStyle(color: Colors.white),),
                      );
                    }
                    else {
                      return SliverList(
                          delegate: SliverChildBuilderDelegate(
                                (context, index) {
                              return PostContainer(
                                post: Post(user: UserModel(
                                  imageUrl: 'https://images.ctfassets.net/hrltx12pl8hq/7yQR5uJhwEkRfjwMFJ7bUK/dc52a0913e8ff8b5c276177890eb0129/offset_comp_772626-opt.jpg?fit=fill&w=800&h=300',
                                  name: qn.docs[index].get('name'),
                                ),
                                    caption: qn.docs[index].get('Text') != null ? qn.docs[index].get('Text') : null,
                                    timeAgo: '0 min',
                                    imageUrl: qn.docs[index].get('img') != null ? qn.docs[index].get('img') : null,
                                    likes: 6345,
                                    comments: 15,
                                    shares: 18,
                                    views: 45
                                ),
                              );
                            },
                            childCount: count,
                          )
                      );
                    }
                  }
              )
            ],
          ),
        );
    

    您只是以错误的顺序包装了小部件。 正确的是 Sliverlist 应该在未来的 builder 中

    【讨论】:

    • 我试过了,但后来出现了一些错误,我认为这是因为我无法在 CostumScrollview 中创建 FutureBuilder 必须有 Sliver 或其他东西。
    • 并尝试将future builder移到脚手架主体参数的顶部
    • 我收到这个错误Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 4350 pos 14: 'owner!._debugCurrentBuildTarget == this': is not true. 就像 100 次一样,如果我这样做,将它移到脚手架主体参数的顶部是什么意思,如果我理解正确,它就不能再滑动了?跨度>
    • @BenjaminFrank 查看代码here
    【解决方案2】:

    我搞定了!这是我的脚本。

        QuerySnapshot qn;
    
    Future getPosts() async {
      var firestore = FirebaseFirestore.instance;
      qn = await firestore.collection("Posts").get();
      qn.docs;
    }
    
    return FutureBuilder(
      future: getPosts(),
      builder: (context, snapshot){
       Widget newsListSliver;
       if(snapshot.connectionState == ConnectionState.waiting) {
         newsListSliver = SliverToBoxAdapter(child: CircularProgressIndicator(),);
      } else {
         newsListSliver = SliverList(delegate: SliverChildBuilderDelegate((context, index) {
          return PostContainer(
            post: Post(
              user: UserModel(
                imageUrl: qn.docs[index].get('picture'),
                name: qn.docs[index].get('name'),
              ),
              caption: qn.docs[index].get('Caption') != null ? qn.docs[index].get('Caption') : null,
              text: qn.docs[index].get('Text') != null ? qn.docs[index].get('Text') : null,
              timeAgo: '0 min', 
              imageUrl: qn.docs[index].get('img') != null ? qn.docs[index].get('img') : null, 
              likes: 6345, 
              comments: 15, 
              shares: 18, 
              views: 45
            ),
          );
        }, childCount: qn.docs.length,)
      );  
    }
    return CustomScrollView(
      slivers: <Widget>[
        appBar,
        newsListSliver
      ],
    );
    

    }, );

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 2023-04-04
      相关资源
      最近更新 更多