11import 'dart:math' ;
22
3- import '../tools/em_log.dart' ;
4-
5- import '../tools/em_message_callback_manager.dart' ;
3+ import 'package:flutter/services.dart' ;
4+ import '../internal/chat_method_keys.dart' ;
65import '../tools/em_extension.dart' ;
76import '../../im_flutter_sdk.dart' ;
8- import '../internal/em_message_state_handle.dart' ;
97
108// 消息类型
119enum EMMessageChatType {
@@ -68,30 +66,58 @@ abstract class EMMessageStatusListener {
6866 void onStatusChanged () {}
6967}
7068
71- class EMMessage {
72- EMMessage ._private () {
73- _tmpKey = localTime.toString ();
69+ class MessageCallBackManager {
70+ static const _channelPrefix = 'com.chat.im' ;
71+ static const MethodChannel _emMessageChannel =
72+ const MethodChannel ('$_channelPrefix /chat_message' , JSONMethodCodec ());
73+ Map <String , EMMessage > cacheMessageMap = {};
74+ static MessageCallBackManager ? _instance;
75+ static MessageCallBackManager get getInstance =>
76+ _instance = _instance ?? MessageCallBackManager ._internal ();
77+ MessageCallBackManager ._internal () {
78+ _emMessageChannel.setMethodCallHandler ((MethodCall call) async {
79+ Map <String , dynamic > argMap = call.arguments;
80+ int ? localTime = argMap['localTime' ];
81+ EMMessage ? msg = cacheMessageMap[localTime.toString ()];
82+ if (msg == null ) {
83+ return null ;
84+ }
85+ if (call.method == ChatMethodKeys .onMessageProgressUpdate) {
86+ return msg._onMessageProgressChanged (argMap);
87+ } else if (call.method == ChatMethodKeys .onMessageError) {
88+ return msg._onMessageError (argMap);
89+ } else if (call.method == ChatMethodKeys .onMessageSuccess) {
90+ return msg._onMessageSuccess (argMap);
91+ } else if (call.method == ChatMethodKeys .onMessageReadAck) {
92+ return msg._onMessageReadAck (argMap);
93+ } else if (call.method == ChatMethodKeys .onMessageDeliveryAck) {
94+ return msg._onMessageDeliveryAck (argMap);
95+ } else if (call.method == ChatMethodKeys .onMessageStatusChanged) {
96+ return msg._onMessageStatusChanged (argMap);
97+ }
98+ return null ;
99+ });
100+ }
101+
102+ addMessage (EMMessage message) {
103+ cacheMessageMap[message.localTime.toString ()] = message;
104+ }
105+
106+ removeMessage (EMMessage message) {
107+ if (cacheMessageMap.containsKey (message.localTime.toString ())) {
108+ cacheMessageMap.remove (message.localTime.toString ());
109+ }
74110 }
111+ }
75112
76- late EMMessageStateHandle _handle;
113+ class EMMessage {
114+ EMMessage ._private ();
77115
78116 /// 构造接收的消息
79117 EMMessage .createReceiveMessage ({
80118 required this .body,
81119 this .direction = EMMessageDirection .RECEIVE ,
82- }) {
83- _tmpKey = localTime.toString ();
84- _handle = EMMessageStateHandle (
85- _tmpKey,
86- onMessageDeliveryAck: _onMessageDeliveryAck,
87- onMessageError: _onMessageError,
88- onMessageProgressChanged: _onMessageProgressChanged,
89- onMessageReadAck: _onMessageReadAck,
90- onMessageSuccess: _onMessageSuccess,
91- onMessageStatusChanged: _onMessageStatusChanged,
92- );
93- MessageCallBackManager .getInstance.addMessage (_tmpKey, _handle);
94- }
120+ });
95121
96122 /// 构造发送的消息
97123 EMMessage .createSendMessage ({
@@ -100,74 +126,70 @@ class EMMessage {
100126 this .to,
101127 this .hasRead = true ,
102128 }) : this .from = EMClient .getInstance.currentUsername,
103- this .conversationId = to {
104- _tmpKey = localTime.toString ();
105- _handle = EMMessageStateHandle (
106- _tmpKey,
107- onMessageDeliveryAck: _onMessageDeliveryAck,
108- onMessageError: _onMessageError,
109- onMessageProgressChanged: _onMessageProgressChanged,
110- onMessageReadAck: _onMessageReadAck,
111- onMessageSuccess: _onMessageSuccess,
112- onMessageStatusChanged: _onMessageStatusChanged,
113- );
114- MessageCallBackManager .getInstance.addMessage (_tmpKey, _handle);
115- }
129+ this .conversationId = to;
116130
117131 void dispose () {
118- MessageCallBackManager .getInstance.removeMessage (_tmpKey);
119- // listener = null;
132+ MessageCallBackManager .getInstance.removeMessage (this );
120133 }
121134
122- void _onMessageError (Map <String , dynamic > map) {
123- EMLog .v ('发送失败 -- ' + map.toString ());
135+ Future <void >? _onMessageError (Map map) {
124136 EMMessage msg = EMMessage .fromJson (map['message' ]);
125137 this ._msgId = msg.msgId;
126138 this .status = msg.status;
127139 this .body = msg.body;
128- listener? .onError (EMError .fromJson (map['error' ]));
140+ if (listener != null ) {
141+ listener! .onError (EMError .fromJson (map['error' ]));
142+ }
129143 return null ;
130144 }
131145
132- void _onMessageProgressChanged (Map <String , dynamic > map) {
133- EMLog .v (
134- '发送 -- ' + ' msg_id: ' + this .msgId! + ' ' + map['progress' ].toString (),
135- );
136- int progress = map['progress' ];
137- listener? .onProgress (progress);
146+ Future <void >? _onMessageProgressChanged (Map map) {
147+ if (this .listener != null ) {
148+ int progress = map['progress' ];
149+ listener! .onProgress (progress);
150+ }
138151 return null ;
139152 }
140153
141- void _onMessageSuccess (Map < String , dynamic > map) {
154+ Future < void > ? _onMessageSuccess (Map map) {
142155 EMMessage msg = EMMessage .fromJson (map['message' ]);
143156 this ._msgId = msg.msgId;
144157 this .status = msg.status;
145158 this .body = msg.body;
146- listener? .onSuccess ();
147- EMLog .v ('发送成功 -- ' + this .toString ());
159+ if (listener != null ) {
160+ listener! .onSuccess ();
161+ }
162+
148163 return null ;
149164 }
150165
151- void _onMessageReadAck (Map <String , dynamic > map) {
152- EMLog .v ('消息已读 -- ' + ' msg_id: ' + this .msgId! );
166+ Future <void >? _onMessageReadAck (Map <String , dynamic > map) {
153167 EMMessage msg = EMMessage .fromJson (map);
154168 this .hasReadAck = msg.hasReadAck;
155- listener? .onReadAck ();
156169
170+ if (listener != null ) {
171+ listener! .onReadAck ();
172+ }
157173 return null ;
158174 }
159175
160- void _onMessageDeliveryAck (Map <String , dynamic > map) {
176+ Future < void > ? _onMessageDeliveryAck (Map <String , dynamic > map) {
161177 EMMessage msg = EMMessage .fromJson (map);
162178 this .hasDeliverAck = msg.hasDeliverAck;
163- listener? .onDeliveryAck ();
179+
180+ if (listener != null ) {
181+ listener! .onDeliveryAck ();
182+ }
164183 return null ;
165184 }
166185
167- void _onMessageStatusChanged (Map <String , dynamic > map) {
186+ Future < void > ? _onMessageStatusChanged (Map <String , dynamic > map) {
168187 EMMessage msg = EMMessage .fromJson (map);
169188 this .status = msg.status;
170- listener? .onStatusChanged ();
189+
190+ if (listener != null ) {
191+ listener! .onStatusChanged ();
192+ }
171193 return null ;
172194 }
173195
@@ -279,10 +301,13 @@ class EMMessage {
279301
280302 void setMessageListener (EMMessageStatusListener ? listener) {
281303 this .listener = listener;
304+ if (listener != null ) {
305+ MessageCallBackManager .getInstance.addMessage (this );
306+ } else {
307+ MessageCallBackManager .getInstance.removeMessage (this );
308+ }
282309 }
283310
284- late String _tmpKey;
285-
286311 /// 消息id
287312 String ? _msgId,
288313 msgLocalId = DateTime .now ().millisecondsSinceEpoch.toString () +
0 commit comments