flutter mqtt chat client
1.0.0
MQChat的Flutter客戶端,該協議是通過MQTT構建的,用於聊天目的。
經紀人應首先安裝HiveMQ Chat-Extension。
使用MQTT作為聊天協議,創建一個支持所有必要功能的現代聊天應用程序。這是MQCHAT的狂潮客戶。
安裝軟件包flutter-mqchat :
flutter pub add flutter-mqchat
可以在/example文件夾中找到一個完整而豐富的示例。
使用現有帳戶的用戶登錄:
bool connected = await ChatApp . instance () ! .clientHandler. connect (
host : "broker.url.com" ,
username : "[email protected]" ,
password : "user_pass" );成功登錄後,MQTT客戶端將收到更新。要收到的第一個更新是個人資料詳細信息,用戶是持續邀請和消息的房間(如果經紀人支持消息歸檔)。
ChatApp . instance () ! .archiveHandler. getUser (). listen ((user) {
//insert/update user to database
});每當將用戶登錄的用戶添加到房間(或更改房間的詳細信息)時,將添加房間詳細信息。
ChatApp . instance () ! .archiveHandler. getAllConversations (). listen ((rooms) {
//insert/update rooms on the Database
}); ChatApp . instance () ! .messageReader. getChatMessages (). listen ((message) {
var dbMessage = message. toDbMessage ();
// insert the message to the database
// send chatmarker if the message is not mine
}); ChatApp . instance () !
.messageReader
. getChatMarkerMessages ()
. listen ((markerMessage) {
String messageId = markerMessage.referenceId;
if (markerMessage.status == ChatMarker .displayed) {
//update the database record
} else if (markerMessage.status == ChatMarker .delivered) {
//update the database record
}
}); ChatApp . instance () !
.invitationHandler
. newInvitationsStream ()
. listen ((invitation) {
if (invitation.type == MessageType . EventInvitationRequest ) {
//new invitation request
//insert invitation record to the database, notify the user
}
if (invitation.type == MessageType . EventInvitationResponseAccept || invitation.type == MessageType . EventInvitationResponseReject ) {
//responded to invitation, update the local record and wait the server to sync the new contact (if accepted).
//Do not insert a room, the user will receive a new room details triggered by getAllConversations()
}
});我們使用它來收聽用戶發送的邀請。可能是:
ChatApp . instance () !
.invitationHandler
. invitationUpdatesStream ()
. listen ((invitation) {
if (invitation.invitationMessageType == InvitationMessageType . INFO ) {
//update the invitation record to be confirmed
}
else if (invitation.invitationMessageType == InvitationMessageType . ERROR ) {
//notify the user, and delete the record in inserted
}
}); ChatMessage newMessage = ChatMessage (
id : "generated_random_id" ,
type : MessageType . ChatText ,
text : "Hello there" ,
roomId : "[room_id]" ,
fromId : "[my_id]" , //optional
sendTime : DateTime . now ().millisecondsSinceEpoch,
fromName : "[my_name]" ); ChatApp . instance () !
.messageSender
. sendChatMessage (newMessage, "[room_id]" ); ChatMessage replyToMessage = ...; //the message to reply to
ChatApp . instance () !
.messageSender
. replyToMessage (replyToMessage, newMessage, widget.contactChat.roomId); ChatApp . instance () ! .messageSender. sendFileChatMessage (
type : MessageType . ChatImage , //for example
fileLocalPath : path,
room : "[room_id]" ); ChatApp . instance () !
.eventsSender
. sendIsTyping ( true , "[room_id]" ); ChatApp . instance () ! .messageReader. getTypingMessages (). listen ((event) {
//using event.roomId and event.isTyping and event.fromId, update the ui state
}); ChatApp . instance () !
.eventsSender
. sendInvitation ( "[invitee_username]" , "[invitation_random_id]" );TODO:向用戶提供更多有關包裝的信息:在哪裡可以找到更多信息,如何為包裝貢獻,如何提交問題,他們可以從包裝作者那裡獲得什麼響應等等。