Firebase 在列表生成器中集成Firestore和Stream builder
我有使用本地列表的自定义列表生成器的工作代码, 以及使用steam builder从firestore获取数据的listTile 我尝试了搜索,但无法将firestore功能合并到自定义列表生成器 我想在下面给出的列表生成器代码中添加firestore函数 这是更简单的工作代码Firebase 在列表生成器中集成Firestore和Stream builder,firebase,flutter,google-cloud-firestore,firebase-authentication,Firebase,Flutter,Google Cloud Firestore,Firebase Authentication,我有使用本地列表的自定义列表生成器的工作代码, 以及使用steam builder从firestore获取数据的listTile 我尝试了搜索,但无法将firestore功能合并到自定义列表生成器 我想在下面给出的列表生成器代码中添加firestore函数 这是更简单的工作代码 class UserInformation extends StatelessWidget { @override Widget build(BuildContext context) { Collec
class UserInformation extends StatelessWidget {
@override
Widget build(BuildContext context) {
CollectionReference users = FirebaseFirestore.instance.collection('users');
return StreamBuilder<QuerySnapshot>(
stream: users.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading");
}
return Expanded(
child: ListView(
children: snapshot.data.docs.map((DocumentSnapshot document) {
return new ListTile(
title: new Text(document.data()['full_name']),
subtitle: new Text(document.data()['company']),
);
}).toList(),
),
);
},
);
}
}
类用户信息扩展无状态小部件{
@凌驾
小部件构建(构建上下文){
CollectionReference users=FirebaseFirestore.instance.collection('users');
返回流生成器(
流:users.snapshots(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
返回文本(“出错”);
}
if(snapshot.connectionState==connectionState.waiting){
返回文本(“加载”);
}
扩大回报(
子:ListView(
子项:snapshot.data.docs.map((DocumentSnapshot文档){
返回新的ListTile(
标题:新文本(document.data()['full_name']),
字幕:新文本(document.data()['company']),
);
}).toList(),
),
);
},
);
}
}
但是我想把firestore的fetch函数集成到这个漂亮的代码中
const DATA = [
{
'id': 1,
'name': 'Kunnar KPD',
'location': 'Hydrabad, Sindh',
},
{
'id': 2,
'name': 'Boby',
'location': 'Unknown',
},
{
'id': 3,
'name': 'Chanda',
'location': 'Unknown',
},
{
'id': 2,
'name': 'Boby',
'location': 'Unknown',
},
{
'id': 3,
'name': 'Chanda',
'location': 'Unknown',
},
{
'id': 2,
'name': 'Boby',
'location': 'Unknown',
},
{
'id': 3,
'name': 'Chanda',
'location': 'Unknown',
},
];
class Traveler extends StatefulWidget {
@override
_RotaTravelerState createState() => _RotaTravelerState();
}
class _RotaTravelerState extends State<Traveler> {
// final CategoriesScroller categoriesScroller = CategoriesScroller();
ScrollController controller = ScrollController();
bool closeTopContainer = false;
double topContainer = 0;
List<Widget> itemsData = [];
void getPostsData() {
List<dynamic> responseList = DATA;
List<Widget> listItems = [];
responseList.forEach((post) {
listItems.add(GestureDetector(
onTap: () {
print(post['id'].toString());
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailsScreen(
id: post['id'],
)));
},
child: Container(
height: 100,
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10),
child: Row(
children: <Widget>[
Column(
children: <Widget>[
Text(
post['name'],
),
Text(
post['location'],
),
],
),
],
),
)),
));
});
setState(() {
itemsData = listItems;
});
}
@override
void initState() {
super.initState();
getPostsData();
controller.addListener(() {
double value =
controller.offset / 140;
setState(() {
topContainer = value;
closeTopContainer = controller.offset > 50;
});
});
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.of(context).size;
// final double categoryHeight = size.height * 0.30;
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text('buetiful'),
),
body: Container(
height: size.height,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
FittedBox(
fit: BoxFit.fitWidth,
child: Row(
children: [
Text(
"Travelers".toUpperCase(),
),
],
),
),
Expanded(
child: ListView.builder(
controller: controller,
itemCount: itemsData.length,
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) {
double scale = 1.0;
if (topContainer > 0.5) {
scale = index + 0.5 - topContainer;
if (scale < 0) {
scale = 0;
} else if (scale > 1) {
scale = 1;
}
}
return Opacity(
opacity: scale,
child: Transform(
transform: Matrix4.identity()..scale(scale, scale),
alignment: Alignment.bottomCenter,
child: Align(
heightFactor: 1,
alignment: Alignment.topCenter,
child: itemsData[index]),
),
);
})),
],
),
),
),
);
}
}
const数据=[
{
“id”:1,
“名称”:“Kunnar KPD”,
“地点”:“信德省海德拉巴德”,
},
{
“id”:2,
'名称':'波比',
“位置”:“未知”,
},
{
"id":3,,
“姓名”:“Chanda”,
“位置”:“未知”,
},
{
“id”:2,
'名称':'波比',
“位置”:“未知”,
},
{
"id":3,,
“姓名”:“Chanda”,
“位置”:“未知”,
},
{
“id”:2,
'名称':'波比',
“位置”:“未知”,
},
{
"id":3,,
“姓名”:“Chanda”,
“位置”:“未知”,
},
];
类Traveler扩展StatefulWidget{
@凌驾
_RotaTravelerState createState()=>\u RotaTravelerState();
}
类_rotateravelerstate扩展状态{
//final CategoriesScroller CategoriesScroller=CategoriesScroller();
ScrollController=ScrollController();
bool closeTopContainer=false;
双topContainer=0;
列表项数据=[];
void getPostsData(){
列表响应列表=数据;
列表项=[];
负责人forEach((职位){
添加(手势检测器)(
onTap:(){
打印(post['id'].toString());
导航器。推(
上下文
材料路线(
生成器:(上下文)=>DetailsScreen(
id:post['id'],
)));
},
子:容器(
身高:100,
孩子:填充(
衬垫:
常数边集对称(水平:20.0,垂直:10),
孩子:排(
儿童:[
纵队(
儿童:[
正文(
post['name'],
),
正文(
post['location'],
),
],
),
],
),
)),
));
});
设置状态(){
itemsData=列表项;
});
}
@凌驾
void initState(){
super.initState();
getPostsData();
controller.addListener(){
双值=
控制器。偏移量/140;
设置状态(){
topContainer=值;
closeTopContainer=controller.offset>50;
});
});
}
@凌驾
小部件构建(构建上下文){
最终大小=MediaQuery.of(context).Size;
//最终双分类高度=尺寸高度*0.30;
返回安全区(
孩子:脚手架(
appBar:appBar(
标题:文本(“buetiful”),
),
主体:容器(
高度:size.height,
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
装配箱(
适合:BoxFit.fitWidth,
孩子:排(
儿童:[
正文(
“旅行者”。toUpperCase(),
),
],
),
),
扩大(
子项:ListView.builder(
控制器:控制器,
itemCount:itemsData.length,
物理:弹跳CrollPhysics(),
itemBuilder:(上下文,索引){
双刻度=1.0;
如果(topContainer>0.5){
比例=指数+0.5-顶部容器;
如果(刻度<0){
比例=0;
}否则,如果(比例>1){
比例=1;
}
}
返回不透明度(
不透明度:比例,
孩子:变换(
变换:Matrix4.identity()…缩放(缩放,缩放),
对齐:对齐.bottomCenter,
子对象:对齐(
高度系数:1,
对齐:alignment.topCenter,
子项:itemsData[索引],
),
);
})),
],
),
),
),
);
}
}