import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Names', home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() { return _MyHomePageState(); } } class _MyHomePageState extends State { final db = Firestore.instance.collection('lots'); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Lot 1')), body: _buildBody( context, db.document('Test-Lot-46').collection('stalls')), ); } Widget _buildBody(BuildContext context, CollectionReference stallDB) { return StreamBuilder( stream: stallDB.snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) return LinearProgressIndicator(); return _buildList(context, snapshot.data.documents); }, ); } Widget _buildList(BuildContext context, List snapshot) { return GridView.count( primary: false, padding: const EdgeInsets.all(60), crossAxisSpacing: 1.0, crossAxisCount: 2, children: snapshot.map((data) => _buildListItem(context, data)).toList(), ); } Widget _buildListItem(BuildContext context, DocumentSnapshot data) { final record = Record.fromSnapshot(data); return Card( key: ValueKey(record.stall), color: Colors.blue, child: Center( child: Column( children: [ ListTile( title: Text("Stall " + record.stall.toString(), style: TextStyle(fontWeight: FontWeight.w500)), subtitle: Text(record.open.toString()), ), ],), ), ); } } class Record { final int stall; final int passID; final bool open; final bool handicap; final DocumentReference reference; Record.fromMap(Map map, {this.reference}) : assert(map['handicap'] != null), assert(map['stall'] != null), assert(map['passID'] != null), assert(map['open'] != null), stall = map['stall'], passID = map['passID'], open = map['open'], handicap = map['handicap']; Record.fromSnapshot(DocumentSnapshot snapshot) : this.fromMap(snapshot.data, reference: snapshot.reference); @override String toString() => "Record<$stall>"; }