Firebase 如何在Flatter中手动指定Listview.builder的第一个元素?

Firebase 如何在Flatter中手动指定Listview.builder的第一个元素?,firebase,flutter,google-cloud-firestore,android-listview,stream-builder,Firebase,Flutter,Google Cloud Firestore,Android Listview,Stream Builder,我有一个flatter应用程序,它在Listview.builder中的卡片上显示事件(存储在CloudFireStore中)。我有一个特别的项目,足球。它有自己的特殊卡片。列表中可以有多个常规赛事,但只能有一个足球赛事。我想把这场足球赛作为第一张牌放在榜首。我怎样才能做到这一点? 到目前为止,我的代码是: import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart';

我有一个flatter应用程序,它在Listview.builder中的卡片上显示事件(存储在CloudFireStore中)。我有一个特别的项目,足球。它有自己的特殊卡片。列表中可以有多个常规赛事,但只能有一个足球赛事。我想把这场足球赛作为第一张牌放在榜首。我怎样才能做到这一点?

到目前为止,我的代码是:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fociapp/model/events.dart';
import 'package:fociapp/ui/event_card.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance.collection("events").snapshots(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          return snapshot.hasData
              ? Container(
                  color: Colors.grey[850],
                  child: ListView.builder(
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (BuildContext context, int index) {
                      DocumentSnapshot events = snapshot.data.documents[index];
                      Event event = Event(
                          events["eventName"],
                          events["startTime"],
                          events["coverImageUrl"],
                          events["location"],
                          events["description"]);

                      return EventCard(event);
                    },
                  ),
                )
              : Center(
                  child: CircularProgressIndicator(),
                );
        });
  }
}


Event是来自Firestore的数据的模型类,EventCard是在卡片中显示数据的小部件。在
列表视图.builder
中,您可以告诉它根据其
索引显示其他内容。我们可以使用if语句来实现这一点。您的索引将始终从0开始,并在构建小部件后每次递增。您可以检查索引是否为0,并在索引为0时显示您的足球赛事

ListView.builder(
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (BuildContext context, int index) {
                      if(index==0){
                      DocumentSnapshot events = snapshot.data.documents[index];
                      Event event = Event(
                          events["eventName"],
                          events["startTime"],
                          events["coverImageUrl"],
                          events["location"],
                          events["description"]);

                      return EventCard(event);
                      }
                      else{
                      //return your other things
                      }
                    },
                  ),
                )

只需将ItemCount增加1。 在ItemBuilder中,如果索引为0,则返回足球卡,如果不是,则返回普通卡(索引-1)

像这样:

ListView.builder(
    itemCount: snapshot.data.documents.length + 1,
    itemBuilder: (BuildContext context, int index) {
       if(index == 0) {
          // return Football-Card
       } else {
           DocumentSnapshot events = snapshot.data.documents[index - 1];
           Event event = Event(
               events["eventName"],
               events["startTime"],
               events["coverImageUrl"],
               events["location"],
               events["description"]);

            return EventCard(event);
        }
     },
),

您只能操作数据以满足要求,不能操作ListView。如下所示:

class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return StreamBuilder(
            stream: Firestore.instance.collection("events").snapshots(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              return snapshot.hasData
                  ? Container(
                color: Colors.grey[850],
                child: createListView(snapshot.data.documents),
              )
                  : Center(
                child: CircularProgressIndicator(),
              );
            });
      }
    
      Widget createListView(List<DocumentSnapshot> documentList){
        // find football and move it to the start position.
        DocumentSnapshot football = documentList.indexWhere((element) => element.eventName == 'football');
        documentList.remove(football);
        documentList.insert(0, football);
    
        return ListView.builder(
          itemCount: documentList.length,
          itemBuilder: (BuildContext context, int index) {
            DocumentSnapshot events = snapshot.data.documents[index];
            Event event = Event(
                events["eventName"],
                events["startTime"],
                events["coverImageUrl"],
                events["location"],
                events["description"]);
    
            return EventCard(event);
          },
        );
      }
    }
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:Firestore.instance.collection(“事件”).snapshots(),
生成器:(BuildContext上下文,异步快照){
返回snapshot.hasData
?容器(
颜色:颜色。灰色[850],
子级:createListView(快照.数据.文档),
)
:中心(
子对象:CircularProgressIndicator(),
);
});
}
小部件createListView(列表文档列表){
//找到足球并将其移动到起始位置。
DocumentSnapshot football=documentList.indexWhere((element)=>element.eventName==“football”);
文件列表。移除(足球);
文档列表。插入(0,足球);
返回ListView.builder(
itemCount:documentList.length,
itemBuilder:(构建上下文,int索引){
DocumentSnapshot事件=snapshot.data.documents[索引];
事件=事件(
事件[“eventName”],
事件[“开始时间”],
事件[“coverImageUrl”],
事件[“位置”],
事件[“描述]);
返回事件卡(事件);
},
);
}
}