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+ final _firestore = FirebaseFirestore .instance;
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 messageTextController = TextEditingController ();
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,22 +73,31 @@ class _ChatScreenState extends State<ChatScreen> {
5073 mainAxisAlignment: MainAxisAlignment .spaceBetween,
5174 crossAxisAlignment: CrossAxisAlignment .stretch,
5275 children: < Widget > [
76+ MessagesStream (),
5377 Container (
5478 decoration: kMessageContainerDecoration,
5579 child: Row (
5680 crossAxisAlignment: CrossAxisAlignment .center,
5781 children: < Widget > [
5882 Expanded (
5983 child: TextField (
84+ controller: messageTextController,
6085 onChanged: (value) {
61- //Do something with the user input.
86+ messageText = value;
87+
6288 },
6389 decoration: kMessageTextFieldDecoration,
6490 ),
6591 ),
6692 FlatButton (
6793 onPressed: () {
68- //Implement send functionality.
94+ //messageText + loggedInUser
95+ messageTextController.clear ();
96+ _firestore.collection ('messages' ).add ({
97+ 'text' : messageText,
98+ 'sender' : loggedInUser? .email,
99+
100+ });
69101 },
70102 child: Text (
71103 'Send' ,
@@ -81,3 +113,85 @@ class _ChatScreenState extends State<ChatScreen> {
81113 );
82114 }
83115}
116+
117+ class MessagesStream extends StatelessWidget {
118+ const MessagesStream ({Key ? key}) : super (key: key);
119+
120+ @override
121+ Widget build (BuildContext context) {
122+ return StreamBuilder <QuerySnapshot <Map <String , dynamic >>>(
123+ stream: _firestore.collection ('messages' ).snapshots (),
124+ builder: (context, snapshot) {
125+ if (! snapshot.hasData) {
126+ return const Center (
127+ child: CircularProgressIndicator (
128+ backgroundColor: Colors .lightBlueAccent,
129+ ),
130+ );
131+ }
132+ final messages = snapshot.data! .docs;
133+ List <MessageBubble > messageWidgets = [];
134+ for (var message in messages) {
135+ final messageText = message.data ()['text' ];
136+ final messageSender = message.data ()['sender' ];
137+
138+ final messageWidget = MessageBubble (text: messageText,sender: messageSender);
139+
140+ messageWidgets.add (messageWidget);
141+ }
142+ return Expanded (
143+ child: ListView (
144+ padding: EdgeInsets .symmetric (horizontal: 10.0 , vertical: 20.0 ),
145+ children: messageWidgets,
146+ )
147+ );
148+ },
149+ );
150+ }
151+ }
152+
153+
154+ class MessageBubble extends StatefulWidget {
155+ final String ? sender;
156+ final String ? text;
157+ const MessageBubble ({Key ? key, this .text,this .sender}) : super (key: key);
158+
159+ @override
160+ State <MessageBubble > createState () => _MessageBubbleState ();
161+ }
162+
163+ class _MessageBubbleState extends State <MessageBubble > {
164+
165+
166+ @override
167+ Widget build (BuildContext context) {
168+ return Padding (
169+ padding: const EdgeInsets .all (8.0 ),
170+ child: Column (
171+ crossAxisAlignment: CrossAxisAlignment .end,
172+ children: < Widget > [
173+ Text ('${widget .sender }' ,
174+ style: const TextStyle (
175+ fontSize: 12.0 ,
176+ color: Colors .black54,
177+ ),),
178+ Material (
179+ borderRadius: BorderRadius .circular (50.0 ),
180+ elevation: 5.0 , //Drop Shadow to each text
181+ color: Colors .lightBlueAccent,
182+ child: Padding (
183+ padding: const EdgeInsets .symmetric (vertical: 10.0 , horizontal: 20.0 ),
184+ child: Text (
185+ '${widget .text }' ,
186+ style: TextStyle (
187+ color: Colors .white,
188+ fontSize: 15.0 ,
189+ ),
190+ ),
191+ ),
192+ ),
193+ ],
194+ ),
195+ );
196+ }
197+ }
0 commit comments