import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'dart:async'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData.dark(), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() { return _MyHomePageState(); } } class _MyHomePageState extends State { final db = Firestore.instance.collection('lots'); static int lot = 5; static int col = 4; // Future> getLots(Future<>) async{ // List lotList = // // return lotList; //} void getLot(){ print("pressed"); } @override Widget build(BuildContext context) { void _swichLayout(){ setState(() { if (col == 2){ print("col = 2"); col=4; } else { print("col =" + col.toString()); col =2; } }); } void _onItemTapped(int index) { getLot(); setState(() { index == 0 ? lot-- : lot++; }); } return Scaffold( appBar: AppBar(title: Text("Lot Number: " + lot.toString()), centerTitle: true,), body: // _buildLot(context, db), _buildBody( context, db.document("Lot" + lot.toString()).collection('stalls'), col), bottomNavigationBar: BottomNavigationBar( // type: BottomNavigationBarType.shifting , items: [ BottomNavigationBarItem(icon: Icon(Icons.arrow_back, color: Colors.white70), title: Text('Last Lot', style: TextStyle(color: Colors.white))), BottomNavigationBarItem(icon: Icon(Icons.arrow_forward, color: Colors.white70), title: Text('Next Lot', style: TextStyle(color: Colors.white))), ], currentIndex: 0, fixedColor: Colors.deepPurple, onTap: _onItemTapped, ), floatingActionButton: FloatingActionButton(onPressed: _swichLayout), ); } } Widget _(BuildContext context, CollectionReference stallDB, int col) { return StreamBuilder( stream: stallDB.snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) return LinearProgressIndicator(); return _buildList(context, snapshot.data.documents, col); }, ); } Widget _buildBody(BuildContext context, CollectionReference stallDB,int col) { return StreamBuilder( stream: stallDB.snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) return LinearProgressIndicator(); return _buildList(context, snapshot.data.documents,col); }, ); } Widget _buildList(BuildContext context, List snapshot,int col) { return GridView.count( primary: false, padding: EdgeInsets.all(120/col), childAspectRatio: 2/col, crossAxisSpacing: 5.0, crossAxisCount: col, children: snapshot.map((data) => _buildListItem(context, data)).toList(), ); } Widget _buildListItem(BuildContext context, DocumentSnapshot data) { final record = Record.fromSnapshot(data); return GestureDetector( onTap: (){ _showInfo(record,context);}, child: Card( key: ValueKey(record.stall), color: (record.open ? Colors.green[200] : Colors.red[100]), child: Center( child: Column( children: [ ListTile( title: Text("Stall " + record.stall.toString(), style: TextStyle(fontWeight: FontWeight.w500)), ), ], ), ), ), ); } //SimpleDialogOption void _showInfo(Record record, context){ print("Record # " + record.stall.toString() + " pressed"); String message = ''; record.handicap ? message =" is designated for handicap" : message=" is not reserved for handicap"; AlertDialog alert = new AlertDialog( content: Text( "Stall # " + record.stall.toString() + message ), ); showDialog(context: context, child: alert); } class LotRecord { final int lot; final int col; final String name; final DocumentReference reference; LotRecord.fromMap(Map map, {this.reference}) : assert(map['lot'] != null), assert(map['col'] != null), assert(map['name'] != null), lot = map['lot'], col = map['col'], name = map['name']; LotRecord.fromSnapshot(DocumentSnapshot snapshot) : this.fromMap(snapshot.data, reference: snapshot.reference); @override String toString() => "Record<$lot>"; } 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>"; }