我想知道如何使用streambuilder将数据从Firestore获取到Flutter应用程序。我创建了必要的样板代码,使小部件已构建并正常工作,并且在下面的代码中headimageassetpath仅是Firestore 中存在的URL字符串。
headimageassetpath
@override Widget build(BuildContext context) { return Scaffold( body: new StreamBuilder( stream: Firestore.instance.collection('Items').snapshots(), builder: (_, AsyncSnapshot<QuerySnapshot> snapshot) { var items = snapshot.data?.documents ?? []; return new Lost_Card( headImageAssetPath : snapshot.data.documents.map()(['url'],) ); }, )
我的消防站:
完整代码:
import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class LostPage extends StatefulWidget { @override _LostPage createState() => new _LostPage(); } class _LostPage extends State<LostPage> { //temp vars final String firebasetest = "Test"; //firestore vars final DocumentReference documentReference = Firestore.instance.document("Items/Rusty"); //CRUD operations void _add() { Map<String, String> data = <String, String>{ "name": firebasetest, "desc": "Flutter Developer" }; documentReference.setData(data).whenComplete(() { print("Document Added"); }).catchError((e) => print(e)); } @override Widget build(BuildContext context) { return Scaffold( body: new StreamBuilder( stream: Firestore.instance.collection('Items').snapshots(), builder: (_, AsyncSnapshot<QuerySnapshot> snapshot) { var items = snapshot.data?.documents ?? []; return new Lost_Card( headImageAssetPath : snapshot.data.documents.map()(['url'],) ); }, ) /*new Lost_Card( headImageAssetPath: "https://i.imgur.com/FtaGNck.jpg" , title: "Mega Dish", noro: "old", )*/, floatingActionButton: new FloatingActionButton( child: new Icon(Icons.add), onPressed: _add), ); } } class Lost_Card extends StatelessWidget { //All the card variables final String headImageAssetPath; final IconData icon; final Color iconBackgroundColor; final String title; final String noro; final int price; final ShapeBorder shape; Lost_Card({ this.headImageAssetPath, //used this.icon, this.iconBackgroundColor, this.title, //used this.noro, //used this.price, }); @override Widget build(BuildContext context) { // TODO: implement build return GridView.count( shrinkWrap: true, crossAxisCount: 2, children: <Widget>[ Card( child: Column( // mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child: Stack( fit: StackFit.expand, children: <Widget>[ Container( height: MediaQuery.of(context).size.height / 4, width: MediaQuery.of(context).size.height / 2.5, child: DecoratedBox( decoration: BoxDecoration( image: DecorationImage( image: NetworkImage( headImageAssetPath), fit: BoxFit.cover), ), ), ), Padding( padding: const EdgeInsets.all(8.0), child: Align( alignment: FractionalOffset.topLeft, child: CircleAvatar( backgroundColor: Colors.redAccent, radius: 15.0, child: Text( noro, textScaleFactor: 0.5, ), ), ), ), Align( alignment: FractionalOffset.topRight, child: Container( color: Colors.blueAccent, height: 35.0, width: 35.0, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Icon(Icons.account_circle), Text( "1P", textScaleFactor: 0.5, ), ], ), ), ), ), ], ), ), Center( child: Container( padding: const EdgeInsets.all(8.0), alignment: FractionalOffset.bottomCenter, child: Text( title, style: TextStyle( fontWeight: FontWeight.w700, ), ), ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ FlatButton( child: Text( "Add To Cart", style: TextStyle(color: Colors.grey[500]), ), onPressed: () => null, ), Text( "\$5", style: TextStyle(color: Colors.grey[500]), ) ], ) ], ), ), ], ); } }
实际应用程序 请对此有所了解。Tks。
这应该适用于一项
body: new StreamBuilder( stream: Firestore.instance.collection("collection").snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return Text( 'No Data...', ); } else { <DocumentSnapshot> items = snapshot.data.documents; return new Lost_Card( headImageAssetPath : items[0]["url"] ); }
如果要从许多文档中创建列表生成器,请像这样使用它
return new ListView.builder( itemCount: snapshot.data.documents.length, itemBuilder: (context, index) { DocumentSnapshot ds = snapshot.data.documents[index]; return new Lost_Card( headImageAssetPath : ds["url"]; );