Firebase 如何在Flatter中手动指定Listview.builder的第一个元素?
我有一个flatter应用程序,它在Listview.builder中的卡片上显示事件(存储在CloudFireStore中)。我有一个特别的项目,足球。它有自己的特殊卡片。列表中可以有多个常规赛事,但只能有一个足球赛事。我想把这场足球赛作为第一张牌放在榜首。我怎样才能做到这一点?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';
到目前为止,我的代码是:
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”],
事件[“位置”],
事件[“描述]);
返回事件卡(事件);
},
);
}
}