diff --git a/CHANGELOG.md b/CHANGELOG.md index 53a71009..bbde3043 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,17 @@ ## NEXT -* 支持gcm推送点击 +## 3.8.3+4 +* 修复消息attribute类型变为bool类型; +* 修复群组免打扰属性不准; +* 修复ios importMessages方法bug; +* 修复群、聊天室禁言时不执行回调的bug; +* 修复下载方法不执行callback; +* 构造文件消息提供设置文件大小属性; +* 修改`EMGroupChangeListener` 为 `EMGroupEventListener` ## 3.8.3+3 -* 修复安卓下resendMessage方法发送失败时不回调onError。 +* 修复安卓下resendMessage方法发送失败时不回调onError; +* 修复fetchChatRoomMembers返回类型错误; ## 3.8.3+2 * 增加群组已读回执; diff --git a/README.md b/README.md index f7beeb96..89ae1bde 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Demo中使用的音视频是针对声网音视频封装的[EaseCallKit](https:// 1. 修改 `pubspec.yaml`; ```dart dependencies: - im_flutter_sdk: ^3.8.3+3 + im_flutter_sdk: ^3.8.3+4 ``` 2. 执行`flutter pub get`; @@ -1656,25 +1656,18 @@ try{ #### 更新自己的用户属性 ```dart try { - - Map aMap = {'nickName': 'gagaga', 'mail': 'xxx@easemob.com'}; - EMUserInfo updateUserInfo = - await EMClient.getInstance.userInfoManager.updateOwnUserInfo(aMap); - } on EMError catch (e) { - print('操作失败,原因是: $e'); - } -``` -#### 更新自己的某一个用户属性 -```dart - try { - EMUserInfoType infoType = EMUserInfoType.EMUserInfoTypeBirth; - String updateValue = '2021.01.01'; - EMUserInfo updateUserInfo = await EMClient.getInstance.userInfoManager - .updateOwnUserInfoWithType(infoType, updateValue); + EMUserInfo info = EMUserInfo(EMClient.getInstance.currentUsername); + info.copyWith( + sign: "修改签名", + nickName: "用户属性昵称", + mail: "xxx@easemob.com", + ); + await EMClient.getInstance.userInfoManager.updateOwnUserInfo(info); } on EMError catch (e) { print('操作失败,原因是: $e'); } ``` + #### 获取多用户的用户属性 ```dart try { diff --git a/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java b/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java index fca0c3a5..7af0212a 100644 --- a/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java +++ b/android/src/main/java/com/easemob/im_flutter_sdk/EMHelper.java @@ -526,44 +526,7 @@ static Map toJson(EMMessage message) { } if (message.ext().size() > 0 && null != message.ext()) { - HashMap map = new HashMap<>(); - for (Map.Entry entry:message.ext().entrySet()) { - String key = entry.getKey().toString(); - try { - JSONObject value = message.getJSONObjectAttribute(key); - map.put(key, value); - continue; - } - catch (HyphenateException e) { - } - try { - boolean value = message.getBooleanAttribute(key); - map.put(key, value); - continue; - } catch (HyphenateException e) { - } - - try { - JSONArray value = message.getJSONArrayAttribute(key); - map.put(key, value); - continue; - } catch (HyphenateException e) { - } - try { - int value = message.getIntAttribute(key); - map.put(key, value); - continue; - } catch (HyphenateException e){ - } - - try { - String value = message.getStringAttribute(key); - map.put(key, value); - continue; - } catch (HyphenateException e) { - } - } - data.put("attributes", map); + data.put("attributes", message.ext()); } data.put("from", message.getFrom()); data.put("to", message.getTo()); diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index f7c89e5f..eaef0504 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -161,7 +161,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cf..3db53b6e 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ /// 消息长按 _messageOnLongPress(EMMessage msg) async { print('长按消息 $msg'); - String toAddUsername; - String reason; - try { - EMClient.getInstance.contactManager.addContact(toAddUsername, reason); - } on EMError catch (e) { - debugPrint(e.toString()); - } } /// 发送文字消息 diff --git a/example/lib/widgets/wx_expression.dart b/example/lib/widgets/wx_expression.dart index 7447a3c4..3dcef94d 100644 --- a/example/lib/widgets/wx_expression.dart +++ b/example/lib/widgets/wx_expression.dart @@ -1,6 +1,3 @@ -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; ///表情组件 diff --git a/ios/Classes/EMChatManagerWrapper.m b/ios/Classes/EMChatManagerWrapper.m index d42e260c..37fb7d4a 100644 --- a/ios/Classes/EMChatManagerWrapper.m +++ b/ios/Classes/EMChatManagerWrapper.m @@ -375,7 +375,7 @@ - (void)importMessages:(NSDictionary *)param result:(FlutterResult)result { __weak typeof(self) weakSelf = self; NSArray *dictAry = param[@"messages"]; - NSMutableArray *messages; + NSMutableArray *messages = [NSMutableArray array]; for (NSDictionary *dict in dictAry) { [messages addObject:[EMMessage fromJson:dict]]; } @@ -395,7 +395,8 @@ - (void)downloadAttachment:(NSDictionary *)param result:(FlutterResult)result { __weak typeof(self) weakSelf = self; __block EMMessage *msg = [EMMessage fromJson:param[@"message"]]; - [EMClient.sharedClient.chatManager downloadMessageAttachment:msg + EMMessage *needDownMSg = [EMClient.sharedClient.chatManager getMessageWithMessageId:msg.messageId]; + [EMClient.sharedClient.chatManager downloadMessageAttachment:needDownMSg progress:^(int progress) { [weakSelf.messageChannel invokeMethod:EMMethodKeyOnMessageProgressUpdate @@ -432,7 +433,8 @@ - (void)downloadThumbnail:(NSDictionary *)param result:(FlutterResult)result { __weak typeof(self) weakSelf = self; __block EMMessage *msg = [EMMessage fromJson:param[@"message"]]; - [EMClient.sharedClient.chatManager downloadMessageThumbnail:msg + EMMessage *needDownMSg = [EMClient.sharedClient.chatManager getMessageWithMessageId:msg.messageId]; + [EMClient.sharedClient.chatManager downloadMessageThumbnail:needDownMSg progress:^(int progress) { [weakSelf.messageChannel invokeMethod:EMMethodKeyOnMessageProgressUpdate @@ -638,6 +640,7 @@ - (void)onConversationRead:(NSString *)from - (void)messagesDidReceive:(NSArray *)aMessages { NSMutableArray *msgList = [NSMutableArray array]; for (EMMessage *msg in aMessages) { + [msgList addObject:[msg toJson]]; } [self.channel invokeMethod:EMMethodKeyOnMessagesReceived diff --git a/lib/src/em_chat_manager.dart b/lib/src/em_chat_manager.dart index bd7b0e27..af98f543 100644 --- a/lib/src/em_chat_manager.dart +++ b/lib/src/em_chat_manager.dart @@ -2,8 +2,6 @@ import "dart:async"; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'models/em_domain_terms.dart'; -import 'em_sdk_method.dart'; class EMChatManager implements EMMessageStatusListener { static const _channelPrefix = 'com.easemob.im'; diff --git a/lib/src/em_chat_room_manager.dart b/lib/src/em_chat_room_manager.dart index 5d7ee5c9..e4cba2f7 100644 --- a/lib/src/em_chat_room_manager.dart +++ b/lib/src/em_chat_room_manager.dart @@ -3,9 +3,6 @@ import "dart:async"; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/src/models/em_domain_terms.dart'; import "em_listeners.dart"; -import 'em_sdk_method.dart'; -import 'package:im_flutter_sdk/src/models/em_cursor_result.dart'; -import 'package:im_flutter_sdk/src/models/em_page_result.dart'; class EMChatRoomManager { static const _channelPrefix = 'com.easemob.im'; @@ -65,13 +62,13 @@ class EMChatRoomManager { break; case EMChatRoomEvent.ON_MUTE_LIST_ADDED: String roomId = event['roomId']; - List mutes = event['mutes']; + List mutes = List.from(event['mutes']); String? expireTime = event['expireTime']; listener.onMuteListAddedFromChatRoom(roomId, mutes, expireTime); break; case EMChatRoomEvent.ON_MUTE_LIST_REMOVED: String roomId = event['roomId']; - List mutes = event['mutes']; + List mutes = List.from(event['mutes']); listener.onMuteListRemovedFromChatRoom(roomId, mutes); break; case EMChatRoomEvent.ON_ADMIN_ADDED: @@ -97,12 +94,12 @@ class EMChatRoomManager { break; case EMChatRoomEvent.ON_WHITE_LIST_ADDED: String roomId = event['roomId']; - List members = event["whitelist"]; + List members = List.from(event["whitelist"]); listener.onWhiteListAddedFromChatRoom(roomId, members); break; case EMChatRoomEvent.ON_WHITE_LIST_REMOVED: String roomId = event['roomId']; - List members = event["whitelist"]; + List members = List.from(event["whitelist"]); listener.onWhiteListRemovedFromChatRoom(roomId, members); break; case EMChatRoomEvent.ON_ALL_MEMBER_MUTE_STATE_CHANGED: diff --git a/lib/src/em_client.dart b/lib/src/em_client.dart index 2410c206..d36a68f8 100644 --- a/lib/src/em_client.dart +++ b/lib/src/em_client.dart @@ -10,10 +10,9 @@ import 'em_userInfo_manager.dart'; import 'em_group_manager.dart'; import 'em_listeners.dart'; import 'em_push_manager.dart'; -import 'em_sdk_method.dart'; import 'models/em_domain_terms.dart'; -import 'models/em_options.dart'; + import 'tools/em_log.dart'; class EMClient { diff --git a/lib/src/em_contact_manager.dart b/lib/src/em_contact_manager.dart index 96e0831d..15ad21b2 100644 --- a/lib/src/em_contact_manager.dart +++ b/lib/src/em_contact_manager.dart @@ -3,10 +3,6 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'em_listeners.dart'; -import 'em_sdk_method.dart'; -import 'models/em_domain_terms.dart'; - class EMContactManager { static const _channelPrefix = 'com.easemob.im'; static const MethodChannel _channel = const MethodChannel( diff --git a/lib/src/em_group_manager.dart b/lib/src/em_group_manager.dart index cd99836e..33f15c1c 100644 --- a/lib/src/em_group_manager.dart +++ b/lib/src/em_group_manager.dart @@ -3,11 +3,6 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'models/em_domain_terms.dart'; -import 'em_sdk_method.dart'; -//import 'em_domain_terms.dart'; -import 'em_listeners.dart'; - class EMGroupManager { static const _channelPrefix = 'com.easemob.im'; static const MethodChannel _channel = const MethodChannel( @@ -560,12 +555,12 @@ class EMGroupManager { } /// @nodoc addGroupChangeListener - Adds [listener] to be aware of group change events. - void addGroupChangeListener(EMGroupChangeListener listener) { + void addGroupChangeListener(EMGroupEventListener listener) { _groupChangeListeners.add(listener); } /// @nodoc removeGroupChangeListener - Remove [listener] from the listener list. - void removeGroupChangeListener(EMGroupChangeListener listener) { + void removeGroupChangeListener(EMGroupEventListener listener) { if (_groupChangeListeners.contains(listener)) { _groupChangeListeners.remove(listener); } @@ -573,7 +568,7 @@ class EMGroupManager { /// @nodoc Future _onGroupChanged(Map? map) async { - for (EMGroupChangeListener listener in _groupChangeListeners) { + for (EMGroupEventListener listener in _groupChangeListeners) { var type = map!['type']; switch (type) { case EMGroupChangeEvent.ON_INVITATION_RECEIVED: @@ -638,13 +633,13 @@ class EMGroupManager { break; case EMGroupChangeEvent.ON_MUTE_LIST_ADDED: String groupId = map['groupId']; - List mutes = map['mutes']; + List mutes = List.from(map['mutes']); int? muteExpire = map['muteExpire']; listener.onMuteListAddedFromGroup(groupId, mutes, muteExpire); break; case EMGroupChangeEvent.ON_MUTE_LIST_REMOVED: String groupId = map['groupId']; - List mutes = map['mutes']; + List mutes = List.from(map['mutes']); listener.onMuteListRemovedFromGroup(groupId, mutes); break; case EMGroupChangeEvent.ON_ADMIN_ADDED: @@ -691,12 +686,12 @@ class EMGroupManager { break; case EMGroupChangeEvent.ON_WHITE_LIST_ADDED: String groupId = map["groupId"]; - List members = map['whitelist']; + List members = List.from(map['whitelist']); listener.onWhiteListAddedFromGroup(groupId, members); break; case EMGroupChangeEvent.ON_WHITE_LIST_REMOVED: String groupId = map["groupId"]; - List members = map['whitelist']; + List members = List.from(map['whitelist']); listener.onWhiteListRemovedFromGroup(groupId, members); break; case EMGroupChangeEvent.ON_ALL_MEMBER_MUTE_STATE_CHANGED: diff --git a/lib/src/em_listeners.dart b/lib/src/em_listeners.dart index b0140e5f..db97ca63 100644 --- a/lib/src/em_listeners.dart +++ b/lib/src/em_listeners.dart @@ -11,11 +11,18 @@ abstract class EMConnectionListener { /// @nodoc abstract class EMMultiDeviceListener { /// @nodoc - void onContactEvent(EMContactGroupEvent? event, String? target, String? ext); + void onContactEvent( + EMContactGroupEvent? event, + String? target, + String? ext, + ); /// @nodoc void onGroupEvent( - EMContactGroupEvent? event, String? target, List? usernames); + EMContactGroupEvent? event, + String? target, + List? usernames, + ); } abstract class EMCustomListener { @@ -164,6 +171,7 @@ class EMGroupChangeEvent { "onAllMemberMuteStateChanged"; } +@Deprecated('Use EMGroupEventListener.') abstract class EMGroupChangeListener { /// id是[groupId], 名称是[groupName]的群邀请被[inviter]拒绝,理由是[reason] void onInvitationReceivedFromGroup( @@ -240,3 +248,80 @@ abstract class EMGroupChangeListener { /// 群组禁言状态发生变化 void onAllGroupMemberMuteStateChanged(String groupId, bool isAllMuted); } + +abstract class EMGroupEventListener { + /// id是[groupId], 名称是[groupName]的群邀请被[inviter]拒绝,理由是[reason] + void onInvitationReceivedFromGroup( + String groupId, String? groupName, String inviter, String? reason); + + /// 收到用户[applicant]申请加入id是[groupId], 名称是[groupName]的群,原因是[reason] + void onRequestToJoinReceivedFromGroup( + String groupId, String? groupName, String applicant, String? reason); + + /// 入群申请被同意 + void onRequestToJoinAcceptedFromGroup( + String groupId, String? groupName, String accepter); + + /// 入群申请被拒绝 + void onRequestToJoinDeclinedFromGroup( + String groupId, String? groupName, String decliner, String? reason); + + /// 入群邀请被同意 + void onInvitationAcceptedFromGroup( + String groupId, String invitee, String? reason); + + /// 入群邀请被拒绝 + void onInvitationDeclinedFromGroup( + String groupId, String invitee, String? reason); + + /// 被移出群组 + void onUserRemovedFromGroup(String groupId, String? groupName); + + /// 群组解散 + void onGroupDestroyed(String groupId, String? groupName); + + /// @nodoc 自动同意加群 + void onAutoAcceptInvitationFromGroup( + String groupId, String inviter, String? inviteMessage); + + /// 群禁言列表增加 + void onMuteListAddedFromGroup( + String groupId, List mutes, int? muteExpire); + + /// 群禁言列表减少 + void onMuteListRemovedFromGroup(String groupId, List mutes); + + /// 群管理增加 + void onAdminAddedFromGroup(String groupId, String admin); + + /// 群管理被移除 + void onAdminRemovedFromGroup(String groupId, String admin); + + /// 群所有者变更 + void onOwnerChangedFromGroup( + String groupId, String newOwner, String oldOwner); + + /// 有用户加入群 + void onMemberJoinedFromGroup(String groupId, String member); + + /// 有用户离开群 + void onMemberExitedFromGroup(String groupId, String member); + + /// 群公告变更 + void onAnnouncementChangedFromGroup(String groupId, String announcement); + + /// 群共享文件增加 + void onSharedFileAddedFromGroup(String groupId, EMGroupSharedFile sharedFile); + + /// 群共享文件被删除 + void onSharedFileDeletedFromGroup(String groupId, String fileId); + + /// 有用户被添加到群组白名单 + void onWhiteListAddedFromGroup(String groupId, List members); + + /// 有用户从群组白名单被移除 + void onWhiteListRemovedFromGroup(String groupId, List members); + + /// 群组禁言状态发生变化 + void onAllGroupMemberMuteStateChanged(String groupId, bool isAllMuted); +} diff --git a/lib/src/em_push_manager.dart b/lib/src/em_push_manager.dart index b142fc54..119b3363 100644 --- a/lib/src/em_push_manager.dart +++ b/lib/src/em_push_manager.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:flutter/services.dart'; -import 'em_sdk_method.dart'; import 'models/em_domain_terms.dart'; class EMPushManager { diff --git a/lib/src/em_userInfo_manager.dart b/lib/src/em_userInfo_manager.dart index 40cc7aba..f7014edf 100644 --- a/lib/src/em_userInfo_manager.dart +++ b/lib/src/em_userInfo_manager.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'em_sdk_method.dart'; -import 'models/em_userInfo.dart'; class EMUserInfoManager { static const _channelPrefix = 'com.easemob.im'; diff --git a/lib/src/models/em_conversation.dart b/lib/src/models/em_conversation.dart index 011bb1e4..c7d4d3a8 100644 --- a/lib/src/models/em_conversation.dart +++ b/lib/src/models/em_conversation.dart @@ -1,10 +1,6 @@ import 'dart:core'; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'package:im_flutter_sdk/src/models/em_error.dart'; -import 'package:im_flutter_sdk/src/models/em_message.dart'; - -import '../em_sdk_method.dart'; enum EMConversationType { Chat, // 单聊消息 diff --git a/lib/src/models/em_message.dart b/lib/src/models/em_message.dart index 88a8a271..a4fb55ea 100644 --- a/lib/src/models/em_message.dart +++ b/lib/src/models/em_message.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'package:flutter/services.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; -import 'package:im_flutter_sdk/src/em_sdk_method.dart'; // 消息类型 enum EMMessageChatType { @@ -99,9 +98,7 @@ class MessageCallBackManager { } addMessage(EMMessage message) { - if (message.status != EMMessageStatus.SUCCESS) { - cacheMessageMap[message.localTime.toString()] = message; - } + cacheMessageMap[message.localTime.toString()] = message; } removeMessage(EMMessage message) { @@ -213,10 +210,12 @@ class EMMessage { required String username, required String filePath, String displayName = '', + int? fileSize, }) : this.createSendMessage( to: username, body: EMFileMessageBody( localPath: filePath, + fileSize: fileSize, displayName: displayName, )); @@ -227,6 +226,7 @@ class EMMessage { String displayName = '', String thumbnailLocalPath = '', bool sendOriginalImage = false, + int? fileSize, double width = 0, double height = 0, }) : this.createSendMessage( @@ -246,6 +246,7 @@ class EMMessage { required String filePath, String displayName = '', int duration = 0, + int? fileSize, String thumbnailLocalPath = '', double width = 0, double height = 0, @@ -255,6 +256,7 @@ class EMMessage { localPath: filePath, displayName: displayName, duration: duration, + fileSize: fileSize, thumbnailLocalPath: thumbnailLocalPath, width: width, height: height, @@ -265,12 +267,14 @@ class EMMessage { required String username, required String filePath, int duration = 0, + int? fileSize, String displayName = '', }) : this.createSendMessage( to: username, body: EMVoiceMessageBody( localPath: filePath, duration: duration, + fileSize: fileSize, displayName: displayName)); /// 构造发送的位置消息 @@ -584,8 +588,11 @@ class EMFileMessageBody extends EMMessageBody { EMFileMessageBody({ this.localPath, this.displayName, + int? fileSize, EMMessageBodyType type = EMMessageBodyType.FILE, - }) : super(type: type); + }) : super(type: type) { + this.fileSize = fileSize ?? 0; + } EMFileMessageBody.fromJson( {required Map map, EMMessageBodyType type = EMMessageBodyType.FILE}) @@ -664,11 +671,13 @@ class EMImageMessageBody extends EMFileMessageBody { String? displayName, this.thumbnailLocalPath, this.sendOriginalImage, + int? fileSize, this.width, this.height, }) : super( localPath: localPath, displayName: displayName, + fileSize: fileSize, type: EMMessageBodyType.IMAGE, ); @@ -727,12 +736,14 @@ class EMVideoMessageBody extends EMFileMessageBody { String? localPath, String? displayName, this.duration, + int? fileSize, this.thumbnailLocalPath, this.height, this.width, }) : super( localPath: localPath, displayName: displayName, + fileSize: fileSize, type: EMMessageBodyType.VIDEO, ); @@ -790,10 +801,12 @@ class EMVoiceMessageBody extends EMFileMessageBody { EMVoiceMessageBody({ localPath, String? displayName, + int? fileSize, this.duration, }) : super( localPath: localPath, displayName: displayName, + fileSize: fileSize, type: EMMessageBodyType.VOICE, ); @@ -854,7 +867,10 @@ class EMCustomMessageBody extends EMMessageBody { Map toJson() { final Map data = super.toJson(); data['event'] = event; - data['params'] = params; + if (params != null) { + data['params'] = params; + } + return data; } diff --git a/lib/src/models/em_push_config.dart b/lib/src/models/em_push_config.dart index 271f71b4..e622b528 100644 --- a/lib/src/models/em_push_config.dart +++ b/lib/src/models/em_push_config.dart @@ -1,7 +1,6 @@ import 'package:flutter/services.dart'; import '../tools/em_log.dart'; -import '../tools/em_extension.dart'; import 'em_domain_terms.dart'; diff --git a/lib/src/models/em_userInfo.dart b/lib/src/models/em_userInfo.dart index 3cd62e65..441fb9f5 100644 --- a/lib/src/models/em_userInfo.dart +++ b/lib/src/models/em_userInfo.dart @@ -14,43 +14,99 @@ enum EMUserInfoType { class EMUserInfo { EMUserInfo(String aUserId); + EMUserInfo._private({ + required this.userId, + this.nickName, + this.avatarUrl, + this.mail, + this.phone, + this.gender, + this.sign, + this.birth, + this.ext, + }); + factory EMUserInfo.fromJson(Map map) { - EMUserInfo info = EMUserInfo.private(map['userId']); + EMUserInfo info = EMUserInfo._private( + userId: map['userId'], + ); info.nickName = map['nickName']; info.avatarUrl = map['avatarUrl']; info.mail = map['mail']; info.phone = map['phone']; - info.gender = map['gender']; + if (map.containsKey("gender")) { + if (map['gender'] as int != 0) { + info.gender = map['gender'] as int; + } + } info.sign = map['sign']; info.birth = map['birth']; info.ext = map['ext']; return info; } + EMUserInfo copyWith({ + String? nickName, + String? avatarUrl, + String? mail, + String? phone, + int? gender, + String? sign, + String? birth, + String? ext, + }) { + return EMUserInfo._private( + userId: this.userId, + nickName: nickName ?? this.nickName, + avatarUrl: avatarUrl ?? this.avatarUrl, + mail: mail ?? this.mail, + phone: phone ?? this.phone, + gender: gender ?? this.gender, + sign: sign ?? this.sign, + birth: birth ?? this.birth, + ext: ext ?? this.birth, + ); + } + Map toJson() { Map data = Map(); data['userId'] = userId; - data['nickName'] = nickName; - data['avatarUrl'] = avatarUrl; - data['mail'] = mail; - data['phone'] = phone; - data['gender'] = gender; - data['sign'] = sign; - data['birth'] = birth; - data['ext'] = ext; + if (nickName != null) { + data['nickName'] = nickName; + } + if (avatarUrl != null) { + data['avatarUrl'] = avatarUrl; + } + if (mail != null) { + data['mail'] = mail; + } + if (phone != null) { + data['phone'] = phone; + } + if (gender != null) { + data['gender'] = gender; + } + if (sign != null) { + data['sign'] = sign; + } + if (birth != null) { + data['birth'] = birth; + } + if (ext != null) { + data['ext'] = ext; + } + return data; } - EMUserInfo.private(this.userId); - String userId = ''; - String? nickName = ''; - String? avatarUrl = ''; - String? mail = ''; - String? phone = ''; - int? gender = 0; - String? sign = ''; - String? birth = ''; - String? ext = ''; + String? nickName; + String? avatarUrl; + String? mail; + String? phone; + int? gender; + String? sign; + String? birth; + String? ext; int expireTime = DateTime.now().millisecondsSinceEpoch; } diff --git a/lib/src/tools/em_extension.dart b/lib/src/tools/em_extension.dart index 8ddaeed1..1ac2d527 100644 --- a/lib/src/tools/em_extension.dart +++ b/lib/src/tools/em_extension.dart @@ -8,6 +8,8 @@ extension MapExtension on Map { return this[key] == 0 ? false : true; } else if (this[key] is String) { return this[key].toString().length == 0 ? false : true; + } else if (this[key] is bool) { + return this[key]; } else { return false; } diff --git a/pubspec.yaml b/pubspec.yaml index 981f7db7..c3292cd2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: im_flutter_sdk description: Easemob IM flutter SDK. -version: 3.8.3+3 +version: 3.8.3+4 homepage: http://www.easemob.com/product/im environment: