개발

[Flutter] 코딩셰프 조금 매운 맛 - 채팅앱

NoDapKeepGoing 2024. 11. 2. 22:23

유용하게 쓰일 것 같은 코드 모음

 

 

[ Firebase Firestore 데이터베이스와 실시간 데이터 스트림 연결 ]

stream: FirebaseFirestore.instance
    .collection('chat')
    .orderBy('time', descending: true)
    .snapshots(),

Firestore의 chat 컬렉션에 실시간으로 접근해 메시지를 가져오는 기능!

이를 통해 사용자가 메시지를 보낼 때마다 자동으로 화면에 업데이트되는 실시간 채팅 기능을 구현할 수 있음!

 

 

 

[ ChatBubble 위젯을 통한 사용자와 타인 메시지 구분 ]

ChatBubble(
    clipper: ChatBubbleClipper8(type: isMe ? BubbleType.sendBubble : BubbleType.receiverBubble),
    backGroundColor: isMe ? Colors.blue : Color(0xffE7E7ED),
    child: Container(
        constraints: BoxConstraints(
            maxWidth: MediaQuery.of(context).size.width * 0.7,
        ),
        child: Column(
            crossAxisAlignment: isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
            children: [
                Text(userName, style: TextStyle(fontWeight: FontWeight.bold, color: isMe ? Colors.white : Colors.black)),
                Text(message, style: TextStyle(color: isMe ? Colors.white : Colors.black)),
            ],
        ),
    ),
)

ChatBubble 위젯은 사용자 메시지와 타인 메시지를 시각적으로 구분해주는 역할!

isMe 플래그를 통해 현재 메시지가 사용자가 보낸 것인지 또는 타인이 보낸 것인지 확인하고, 이에 따라 텍스트의 정렬과 배경색이 달라짐!!

 

 

 

[ Firestore에 새 메시지 저장 ]

FirebaseFirestore.instance.collection('chat').add({
    'text': _userEnterMessage,
    'time': Timestamp.now(),
    'userID': user!.uid,
    'userName': userData.data()!['userName'],
    'userImage': userData['picked_image']
});

_sendMessage 함수는 사용자가 입력한 메시지를 Firestore의 chat 컬렉션에 저장함

메시지 외에도 메시지를 보낸 시간, 사용자 ID, 사용자 이름, 사용자 이미지 등도 함께 저장하여 채팅 내용에 정보를 추가함

 

 

 

[ 메시지 입력 필드와 전송 버튼 활성화/비활성화 ]

onPressed: _userEnterMessage.trim().isEmpty ? null : _sendMessage,

메시지 입력이 공백이거나 비어 있을 경우 전송 버튼이 비활성화되도록 설정

사용자가 빈 메시지를 보내지 않도록 방지 -> 불필요한 데이터 저장을 줄이고 앱 사용성 개선

 

 

 

[ 사용자 아바타와 메시지의 시각적 배치 ]

Positioned(
    top: 0,
    right: isMe ? 5 : null,
    left: isMe ? null : 5,
    child: CircleAvatar(
        backgroundImage: NetworkImage(userImage),
    ),
)

CircleAvatar를 사용해 메시지를 보낸 사용자의 프로필 이미지를 표시함

사용자 프로필 이미지는 isMe 플래그에 따라 메시지 말풍선의 좌우에 위치하도록 배치!