1. 규칙 추가

Firebase Database에 chat 컬랙션 추가

2. new_message.dart
더보기
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class NewMessage extends StatefulWidget {
@override
State<NewMessage> createState() => _NewMessageState();
}
class _NewMessageState extends State<NewMessage> {
final _controller = new TextEditingController();
var _enteredMessage = '';
// 넣는 부분
Future<void> _sendMessage() async {
FocusScope.of(context).unfocus();
final userId = FirebaseAuth.instance.currentUser!.uid;
final userData =
await FirebaseFirestore.instance.collection('users').doc(userId).get();
FirebaseFirestore.instance.collection('chat').add({
'text': _enteredMessage,
'createdAt': Timestamp.now(),
'userId': userId,
'username': userData['username'],
// 'username': userData,
});
_controller.clear();
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 8),
padding: EdgeInsets.all(8),
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: InputDecoration(labelText: 'Send a message...'),
onChanged: (value) {
setState(() {
_enteredMessage = value;
});
},
),
),
IconButton(
color: Theme.of(context).primaryColor,
icon: Icon(
Icons.send,
),
onPressed: _enteredMessage.trim().isEmpty ? null : _sendMessage,
),
],
),
);
}
}
Firebase에 채팅 내용 추가
FirebaseFirestore.instance.collection('chat').add({
'text': _enteredMessage,
'createdAt': Timestamp.now(),
'userId': userId,
'username': userData['username'],
});
3 message_bubble.dart
메시지 위치 및 메시지 배경
더보기
import 'package:flutter/material.dart';
class MessageBubble extends StatelessWidget {
MessageBubble(this.message, this.username, this.isMe, {required this.key});
final String message;
final String username;
final bool isMe;
final Key key;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: isMe ? MainAxisAlignment.end : MainAxisAlignment.start,
children: [
Container(
decoration: BoxDecoration(
color: isMe ? Colors.grey[300] : Theme.of(context).accentColor,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
bottomLeft: !isMe ? Radius.circular(0) : Radius.circular(12),
bottomRight: isMe ? Radius.circular(0) : Radius.circular(12),
),
),
width: 140,
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
margin: const EdgeInsets.symmetric(
vertical: 4,
horizontal: 8,
),
child: Column(
crossAxisAlignment:
isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [
Text(
username,
style: TextStyle(
color: isMe
? Colors.black
: Theme.of(context).accentTextTheme.headline1!.color,
),
),
Text(
message,
style: TextStyle(
color: isMe
? Colors.black
: Theme.of(context).accentTextTheme.headline1!.color,
),
),
],
),
),
],
);
}
}
내 메시지인지 아닌지에 따라 왼쪽인지 오른쪽인지 결정.
mainAxisAlignment: isMe ? MainAxisAlignment.end : MainAxisAlignment.start,
4. message.dart
더보기
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'message_bubble.dart';
class Messages extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection('chat')
.orderBy(
'createdAt',
descending: true,
)
.snapshots(),
builder: (context, futureSnapshot) {
if (futureSnapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
final chatDocs = futureSnapshot.data!.docs;
return ListView.builder(
reverse: true,
itemCount: chatDocs.length,
itemBuilder: (context, index) => MessageBubble(
chatDocs[index]['text'],
chatDocs[index]['username'],
FirebaseAuth.instance.currentUser!.uid == chatDocs[index]['userId'],
key: ValueKey(chatDocs[index].id),
),
);
},
);
}
}
결과 :

'Flutter 학습 > 채팅 앱 만들기' 카테고리의 다른 글
채팅앱 만들기 - 5 (사진) (0) | 2023.03.03 |
---|---|
채팅앱 만들기 3 (Auth) (0) | 2023.02.22 |
채팅앱 만들기2 (앱과 Firebase 연결) (0) | 2023.02.21 |
채팅앱 만들기1 (Firebase 설정) (0) | 2023.02.21 |