1+ import 'package:cloud_firestore/cloud_firestore.dart' ;
12import 'package:firebase_auth/firebase_auth.dart' ;
23import 'package:flutter/material.dart' ;
34import 'package:flash_chat_flutter_firebase/constants.dart' ;
45
6+
57class ChatScreen extends StatefulWidget {
68 static const String id = 'chat_screen' ;
79 @override
810 _ChatScreenState createState () => _ChatScreenState ();
911}
1012
1113class _ChatScreenState extends State <ChatScreen > {
14+
15+ final _firestore = FirebaseFirestore .instance;
1216 final _auth = FirebaseAuth .instance;
1317 User ? loggedInUser;
18+ String ? messageText;
1419
1520 void getCurrentUser () async {
1621 try {
@@ -24,6 +29,22 @@ class _ChatScreenState extends State<ChatScreen> {
2429 print (e);
2530 }
2631 }
32+
33+ // void getMessages() async{
34+ // final messages = await _firestore.collection('messages').get();
35+ // for(var message in messages.docs){
36+ // print(message.data());
37+ // }
38+ // }
39+ void getMessages () async {
40+ await for (var snapshot in _firestore.collection ('messages' ).snapshots ()) {
41+ for (var messages in snapshot.docs) {
42+ print (messages.data ());
43+ }
44+ }
45+ }
46+
47+
2748 @override
2849 void initState () {
2950 super .initState ();
@@ -39,7 +60,9 @@ class _ChatScreenState extends State<ChatScreen> {
3960 IconButton (
4061 icon: Icon (Icons .close),
4162 onPressed: () {
42- //Implement logout functionality
63+ // _auth.signOut();
64+ // Navigator.pop(context);
65+ getMessages ();
4366 }),
4467 ],
4568 title: Text ('⚡️Chat' ),
@@ -50,6 +73,34 @@ class _ChatScreenState extends State<ChatScreen> {
5073 mainAxisAlignment: MainAxisAlignment .spaceBetween,
5174 crossAxisAlignment: CrossAxisAlignment .stretch,
5275 children: < Widget > [
76+ StreamBuilder <QuerySnapshot <Map <String , dynamic >>>(
77+ stream: _firestore.collection ('messages' ).snapshots (),
78+ builder: (context, snapshot) {
79+ if (! snapshot.hasData) {
80+ return const Center (
81+ child: CircularProgressIndicator (
82+ backgroundColor: Colors .lightBlueAccent,
83+ ),
84+ );
85+ }
86+ final messages = snapshot.data! .docs;
87+ List <MessageBubble > messageWidgets = [];
88+ for (var message in messages) {
89+ final messageText = message.data ()['text' ];
90+ final messageSender = message.data ()['sender' ];
91+
92+ final messageWidget = MessageBubble (text: messageText,sender: messageSender);
93+
94+ messageWidgets.add (messageWidget);
95+ }
96+ return Expanded (
97+ child: ListView (
98+ padding: EdgeInsets .symmetric (horizontal: 10.0 , vertical: 20.0 ),
99+ children: messageWidgets,
100+ )
101+ );
102+ },
103+ ),
53104 Container (
54105 decoration: kMessageContainerDecoration,
55106 child: Row (
@@ -58,14 +109,20 @@ class _ChatScreenState extends State<ChatScreen> {
58109 Expanded (
59110 child: TextField (
60111 onChanged: (value) {
61- //Do something with the user input.
112+ messageText = value;
113+
62114 },
63115 decoration: kMessageTextFieldDecoration,
64116 ),
65117 ),
66118 FlatButton (
67119 onPressed: () {
68- //Implement send functionality.
120+ //messageText + loggedInUser
121+ _firestore.collection ('messages' ).add ({
122+ 'text' : messageText,
123+ 'sender' : loggedInUser? .email,
124+
125+ });
69126 },
70127 child: Text (
71128 'Send' ,
@@ -81,3 +138,43 @@ class _ChatScreenState extends State<ChatScreen> {
81138 );
82139 }
83140}
141+
142+ class MessageBubble extends StatefulWidget {
143+ final String ? sender;
144+ final String ? text;
145+ const MessageBubble ({Key ? key, this .text,this .sender}) : super (key: key);
146+
147+ @override
148+ State <MessageBubble > createState () => _MessageBubbleState ();
149+ }
150+
151+ class _MessageBubbleState extends State <MessageBubble > {
152+
153+
154+ @override
155+ Widget build (BuildContext context) {
156+ return Padding (
157+ padding: const EdgeInsets .all (8.0 ),
158+ child: Column (
159+ children: < Widget > [
160+ Text ('${widget .sender }' ),
161+ Material (
162+ borderRadius: BorderRadius .circular (50.0 ),
163+ elevation: 5.0 , //Drop Shadow to each text
164+ color: Colors .lightBlueAccent,
165+ child: Padding (
166+ padding: const EdgeInsets .symmetric (vertical: 10.0 , horizontal: 20.0 ),
167+ child: Text (
168+ '${widget .text }' ,
169+ style: TextStyle (
170+ color: Colors .white,
171+ fontSize: 15.0 ,
172+ ),
173+ ),
174+ ),
175+ ),
176+ ],
177+ ),
178+ );
179+ }
180+ }
0 commit comments