Firebase 在列表生成器中集成Firestore和Stream builder

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

我有使用本地列表的自定义列表生成器的工作代码, 以及使用steam builder从firestore获取数据的listTile 我尝试了搜索,但无法将firestore功能合并到自定义列表生成器 我想在下面给出的列表生成器代码中添加firestore函数

这是更简单的工作代码

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[索引],
),
);
})),
],
),
),
),
);
}
}