iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0

好的,今天我們要來看的就是我們的精華啦-聊天室。 原本我們在設計邀約流程的時候是。

(原本設想的流程)

https://ithelp.ithome.com.tw/upload/images/20211003/201380177Rpqeck6zA.png

但是想了一下,發現這樣對使用者來說非常不友善(不能只在這個平台完成所有的邀約+接受流程)
所以後來就想說直接做個一對一的聊天室,直接讓他們在本APP進行聊天!

(現在要做的流程)
https://ithelp.ithome.com.tw/upload/images/20211003/20138017zPagOVo95y.png

好的,既然我們已經看了大致上的流程,接下來我們就來開始吧!!

一、建立Message

data class Message(
    val user_name: String? = null,
    val message: String? = null,
    val time: Any? = null,
    val send_user_id: String? = null,
    val accept_user_id: String? = null,
    val send_user_image: String? = null,
)

二、建立 ChatRoomFragment

我們需要一個Fragment讓我們來放訊息的Recyclerview跟傳送訊息,所以我們就直接建立一個Fragment,layout可以參考以下

簡單明瞭,一個recyclerview,一個Edtext,一個button

https://ithelp.ithome.com.tw/upload/images/20211003/20138017rQNK4jGwN7.png

三、傳送訊息

我們一樣在chatRoomFragment來新增以下,把它傳進我們的viewModel

private fun sendMessage(){

        val message = Message(
            user_name = accountViewModel.userDetail.value!!.name,
            message = binding.edChatRoomMessage.text.toString().trim(),
            send_user_id = accountViewModel.userDetail.value!!.id,
            accept_user_id = matchingViewModel.selectedInvitation.value!!.user_id,
            send_user_image = accountViewModel.userDetail.value!!.image,
            time = ServerValue.TIMESTAMP
        )
        chatViewModel.sendMessage(message)
				//然後再把輸入清空
        binding.edChatRoomMessage.setText("")

    }

★我們可以直接用ServerValue.TIMESTAMP來拿到當前的時間,並且是Long的格式

好的,然後到我們的viewModel新增!

因為我們希望我們當A給B的時候,B也可以收到訊息,所以我在A傳送訊息後,A→B的地方也會新增Message,B→A的地方也會新增Message,這樣就可以達到聊天的功能啦!
fun sendMessage(message: Message){
       
				//新增傳送者給收件者的資料
        FirebaseDatabase.getInstance().reference.child(message.send_user_id!!).child(message.accept_user_id!!).push().setValue(message)
            .addOnSuccessListener {
                Timber.d("成功上至 send_user那邊囉")
            }
            .addOnFailureListener {
                Timber.d("Fail至 send_user cause$it")
            }
	
				//新增收件者對傳送者的資料
        FirebaseDatabase.getInstance().reference.child(message.accept_user_id).child(message.send_user_id).push().setValue(message)
            .addOnSuccessListener {
                Timber.d("成功上至 accept_user那邊囉")
            }
            .addOnFailureListener {
                Timber.d("Fail至 accept_user cause$it")
            }
    }
  • push:新增節點
  • setValue:寫入或是替代資料

以下就是我們的資料型態啦!!

https://ithelp.ithome.com.tw/upload/images/20211003/20138017u8YgSMb0nJ.png

以下就是我們的資料型態啦!!


上一篇
【day17】 時間格式 X 搜尋結果排序
下一篇
【day19】聊天室(下) X Realtime database
系列文
30天建立寵物約散App-Android新手篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言