import 'package:flutter/material.dart'; import 'package:dart_firebase/api.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } const _app = App( apiKey: 'FIREBASE_API_KEY', projectId: 'project-id', ); class _MyHomePageState extends State { FirestoreClient _client; final _formKey = GlobalKey(); bool _loading = false; String _username, _password; void _login() async { if (_formKey.currentState.validate()) { _formKey.currentState.save(); _setLoding(true); final client = FirestoreClient(_username, _password, _app); try { await client.login(); if (mounted && client != null) { print('token: ${client?.token?.accessToken}'); _client = client; } } on Exception catch (e) { print(e); } } _setLoding(false); } void _setLoding(bool value) { if (mounted) setState(() { _loading = value; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Builder( builder: (_) { if (_client == null || !_client.isAuthorized) { return Center( child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( decoration: InputDecoration(filled: true, hintText: 'Username'), onSaved: (val) => _username = val, validator: (val) => val.isEmpty ? 'Username Required' : null, ), ), Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( decoration: InputDecoration(filled: true, hintText: 'Password'), onSaved: (val) => _password = val, validator: (val) => val.isEmpty ? 'Password Required' : null, obscureText: true, ), ), RaisedButton.icon( icon: Icon(Icons.account_circle), label: Text('Login'), onPressed: _loading ? null : _login, ), if (_loading) ...[CircularProgressIndicator()], ], ), ), ); } return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ RaisedButton.icon( icon: Icon(Icons.people), label: Text('Get Users'), onPressed: () => Navigator.push( context, MaterialPageRoute( builder: (_) => UsesExample(client: _client), )), ), ], ), ); }, ), ); } } class UsesExample extends StatefulWidget { UsesExample({ @required this.client, }); final FirestoreClient client; @override _UsesExampleState createState() => _UsesExampleState(); } class _UsesExampleState extends State { @override void initState() { _getUsers(); super.initState(); } List _users; void _getUsers() async { final _path = widget.client.collection('users'); print('Data: ${_path.path} ${_path.pathComponents} ${_path.documentID}'); final _data = await _path.snapshots(); if (mounted) setState(() { _users = _data; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Users List'), ), body: Builder( builder: (_) { if (_users.isEmpty) { return Center( child: Text('No Users Found'), ); } return ListView.builder( itemCount: _users.length, itemBuilder: (_, index) { final _item = _users[index]; return ListTile( title: Text( '${_item?.data['first_name'] ?? ''} ${_item?.data['last_name'] ?? ''}'), subtitle: Text(_item.data['email']), ); }, ); }, ), ); } }