[Super Group]

main
hrxiang 3 years ago
parent a9343bf892
commit c76bfeb07a
  1. 4
      .idea/libraries/Flutter_Plugins.xml
  2. 17
      CHANGELOG.md
  3. 2
      android/build.gradle
  4. 8
      android/src/main/java/io/openim/flutter_openim_sdk/listener/OnAdvancedMsgListener.java
  5. 26
      android/src/main/java/io/openim/flutter_openim_sdk/manager/GroupManager.java
  6. 8
      android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java
  7. 2
      example/ios/Runner/Info.plist
  8. 2
      example/pubspec.lock
  9. 17
      ios/Classes/Module/GroupManager.swift
  10. 143
      ios/Classes/Module/MessageManager.swift
  11. 2
      ios/flutter_openim_sdk.podspec
  12. 5
      lib/src/enum/conversation_type.dart
  13. 3
      lib/src/enum/message_type.dart
  14. 9
      lib/src/listener/advanced_msg_listener.dart
  15. 4
      lib/src/manager/im_conversation_manager.dart
  16. 51
      lib/src/manager/im_group_manager.dart
  17. 5
      lib/src/manager/im_manager.dart
  18. 16
      lib/src/manager/im_message_manager.dart
  19. 9
      lib/src/models/conversation_info.dart
  20. 41
      lib/src/models/group_info.dart
  21. 76
      lib/src/models/message.dart
  22. 7
      lib/src/models/user_info.dart
  23. 2
      lib/src/openim.dart
  24. 2
      pubspec.yaml

@ -1,8 +1,6 @@
<component name="libraryTable">
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES>
<root url="file://$PROJECT_DIR$" />
</CLASSES>
<CLASSES />
<JAVADOC />
<SOURCES />
</library>

@ -1,3 +1,20 @@
## 2.3.0
1.Fix bug </br>
2.Add super group type </br>
3.Add setGroupLookMemberInfo method </br>
4.Add setGroupApplyMemberFriend method </br>
5.Add lookMemberInfo field </br>
6.Add applyMemberFriend field</br>
7.Add inviterUserID field</br>
8.Add notificationUpdateTime field</br>
9.Add notificationUserID field</br>
10.Add joinSource field for joinGroup method </br>
11.Add advanced revoke type</br>
12.Add recvMessageRevokedV2 callback</br>
13.Add revokeMessageV2 method </br>
14.Add getGroupOwnerAndAdmin method</br>
## 2.2.0
1.Fix bug </br>

@ -41,5 +41,5 @@ android {
}
}
dependencies {
implementation 'io.openim:core-sdk:2.2.0@aar'
implementation 'io.openim:core-sdk:2.3.0@aar'
}

@ -13,6 +13,14 @@ public class OnAdvancedMsgListener implements open_im_sdk_callback.OnAdvancedMsg
this.id = listenerId;
}
@Override
public void onNewRecvMessageRevoked(String s) {
final Map<String, String> values = new ArrayMap<>();
values.put("id", id);
values.put("revokedMessageV2", s);
CommonUtil.emitEvent("advancedMsgListener", "onNewRecvMessageRevoked", values);
}
@Override
public void onRecvC2CReadReceipt(String s) {
final Map<String, String> values = new ArrayMap<>();

@ -91,7 +91,8 @@ public class GroupManager extends BaseManager {
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "gid"),
value(methodCall, "reason")
value(methodCall, "reason"),
value(methodCall, "joinSource")
);
}
@ -219,4 +220,27 @@ public class GroupManager extends BaseManager {
value(methodCall, "needVerification")
);
}
public void setGroupLookMemberInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupLookMemberInfo(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void setGroupApplyMemberFriend(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setGroupApplyMemberFriend(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID"),
value(methodCall, "status")
);
}
public void getGroupMemberOwnerAndAdmin(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getGroupMemberOwnerAndAdmin(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "groupID")
);
}
}

@ -389,4 +389,12 @@ public class MessageManager extends BaseManager {
jsonValue(methodCall)
);
}
public void newRevokeMessage(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.newRevokeMessage(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
jsonValue(methodCall)
);
}
}

@ -41,5 +41,7 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
</dict>
</plist>

@ -68,7 +68,7 @@ packages:
path: ".."
relative: true
source: path
version: "2.2.0"
version: "2.3.0"
flutter_test:
dependency: "direct dev"
description: flutter

@ -29,6 +29,9 @@ public class GroupManager: BaseServiceManager {
self["setGroupMemberRoleLevel"] = setGroupMemberRoleLevel
self["getGroupMemberListByJoinTimeFilter"] = getGroupMemberListByJoinTimeFilter
self["setGroupVerification"] = setGroupVerification
self["setGroupLookMemberInfo"] = setGroupLookMemberInfo
self["setGroupApplyMemberFriend"] = setGroupApplyMemberFriend
self["getGroupMemberOwnerAndAdmin"] = getGroupMemberOwnerAndAdmin
}
func setGroupListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@ -72,7 +75,7 @@ public class GroupManager: BaseServiceManager {
}
func joinGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"])
Open_im_sdkJoinGroup(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "gid"], methodCall[string: "reason"], methodCall[int32: "joinSource"])
}
func quitGroup(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@ -130,6 +133,18 @@ public class GroupManager: BaseServiceManager {
func setGroupVerification(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupVerification(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"needVerification"])
}
func setGroupLookMemberInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupLookMemberInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func setGroupApplyMemberFriend(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkSetGroupApplyMemberFriend(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"], methodCall[int32:"status"])
}
func getGroupMemberOwnerAndAdmin(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkGetGroupMemberOwnerAndAdmin(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "groupID"])
}
}
public class GroupListener: NSObject, Open_im_sdk_callbackOnGroupListenerProtocol {

@ -44,6 +44,7 @@ public class MessageManager: BaseServiceManager {
self["clearC2CHistoryMessageFromLocalAndSvr"] = clearC2CHistoryMessageFromLocalAndSvr
self["clearGroupHistoryMessageFromLocalAndSvr"] = clearGroupHistoryMessageFromLocalAndSvr
self["getHistoryMessageListReverse"] = getHistoryMessageListReverse
self["newRevokeMessage"] = newRevokeMessage
}
func setAdvancedMsgListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
@ -214,70 +215,82 @@ public class MessageManager: BaseServiceManager {
Open_im_sdkGetHistoryMessageListReverse(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
private let channel: FlutterMethodChannel
private let result: FlutterResult
private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel
self.result = result
self.call = methodCall
}
public func onError(_ errCode: Int32, errMsg: String?) {
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
}
public func onProgress(_ progress: Int) {
var values: [String: Any] = [:]
let message = call[dict: "message"]
values["clientMsgID"] = message["clientMsgID"]
values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
}
public func onSuccess(_ data: String?) {
DispatchQueue.main.async { self.result(data) }
}
}
public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol {
private let channel: FlutterMethodChannel
private let id: String
init(channel: FlutterMethodChannel, id: String) {
self.channel = channel
self.id = id
}
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["c2cMessageReadReceipt"] = msgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvGroupReadReceipt(_ groupMsgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["groupMessageReadReceipt"] = groupMsgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageRevoked(_ msgId: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["revokedMessage"] = msgId
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
public func onRecvNewMessage(_ message: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["newMessage"] = message
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values)
}
func newRevokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){
Open_im_sdkNewRevokeMessage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall.toJsonString())
}
}
public class SendMsgProgressListener: NSObject, Open_im_sdk_callbackSendMsgCallBackProtocol {
private let channel: FlutterMethodChannel
private let result: FlutterResult
private let call: FlutterMethodCall
init(channel: FlutterMethodChannel, result: @escaping FlutterResult, methodCall: FlutterMethodCall) {
self.channel = channel
self.result = result
self.call = methodCall
}
public func onError(_ errCode: Int32, errMsg: String?) {
DispatchQueue.main.async { self.result(FlutterError(code: "\(errCode)", message: errMsg, details: nil)) }
}
public func onProgress(_ progress: Int) {
var values: [String: Any] = [:]
let message = call[dict: "message"]
values["clientMsgID"] = message["clientMsgID"]
values["progress"] = progress
CommonUtil.emitEvent(channel: channel, method: "msgSendProgressListener", type: "onProgress", errCode: nil, errMsg: nil, data: values)
}
public func onSuccess(_ data: String?) {
DispatchQueue.main.async { self.result(data) }
}
}
public class AdvancedMsgListener: NSObject, Open_im_sdk_callbackOnAdvancedMsgListenerProtocol {
private let channel: FlutterMethodChannel
private let id: String
init(channel: FlutterMethodChannel, id: String) {
self.channel = channel
self.id = id
}
public func onRecvC2CReadReceipt(_ msgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["c2cMessageReadReceipt"] = msgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvC2CReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvGroupReadReceipt(_ groupMsgReceiptList: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["groupMessageReadReceipt"] = groupMsgReceiptList
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvGroupReadReceipt", errCode: nil, errMsg: nil, data: values)
}
public func onRecvMessageRevoked(_ msgId: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["revokedMessage"] = msgId
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
public func onRecvNewMessage(_ message: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["newMessage"] = message
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onRecvNewMessage", errCode: nil, errMsg: nil, data: values)
}
public func onNewRecvMessageRevoked(_ messageRevoked: String?) {
var values: [String: Any] = [:]
values["id"] = id
values["revokedMessageV2"] = messageRevoked
CommonUtil.emitEvent(channel: channel, method: "advancedMsgListener", type: "onNewRecvMessageRevoked", errCode: nil, errMsg: nil, data: values)
}
}

@ -17,7 +17,7 @@ A new Flutter project.
s.dependency 'Flutter'
s.platform = :ios, '8.0'
s.dependency 'OpenIMSDKCore','2.2.0'
s.dependency 'OpenIMSDKCore','2.3.0'
s.static_framework = true
# s.vendored_frameworks = 'Framework/*.framework'
# Flutter.framework does not contain a i386 slice.

@ -3,9 +3,12 @@ class ConversationType {
///
static const single = 1;
///
///
static const group = 2;
///
static const superGroup = 3;
///
static const notification = 4;
}

@ -45,6 +45,9 @@ class MessageType {
///
static const custom_face = 115;
///
static const advancedRevoke = 118;
///
static const notificationBegin = 1000;

@ -6,6 +6,7 @@ class OnAdvancedMsgListener {
Function(List<ReadReceiptInfo> list)? onRecvGroupMessageReadReceipt;
Function(String msgId)? onRecvMessageRevoked;
Function(Message msg)? onRecvNewMessage;
Function(RevokedInfo info)? onRecvMessageRevokedV2;
/// Uniquely identifies
String id;
@ -13,8 +14,9 @@ class OnAdvancedMsgListener {
OnAdvancedMsgListener({
this.onRecvC2CMessageReadReceipt,
this.onRecvGroupMessageReadReceipt,
this.onRecvMessageRevoked,
@deprecated this.onRecvMessageRevoked,
this.onRecvNewMessage,
this.onRecvMessageRevokedV2,
}) : id = "id_${DateTime.now().microsecondsSinceEpoch}";
/// C2C消息已读回执
@ -36,4 +38,9 @@ class OnAdvancedMsgListener {
void recvNewMessage(Message msg) {
onRecvNewMessage?.call(msg);
}
///
void recvMessageRevokedV2(RevokedInfo info) {
onRecvMessageRevokedV2?.call(info);
}
}

@ -46,7 +46,7 @@ class ConversationManager {
///
/// [sourceID] userIDGroupID
/// [sessionType] 12
/// [sessionType] [ConversationType]
Future<ConversationInfo> getOneConversation({
required String sourceID,
required int sessionType,
@ -149,7 +149,7 @@ class ConversationManager {
/// id
/// [sourceID] IDID
/// [sessionType] 12
/// [sessionType] [ConversationType]
Future<dynamic> getConversationIDBySessionType({
required String sourceID,
required int sessionType,

@ -236,16 +236,19 @@ class GroupManager {
(value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// /
/// [joinSource] 2 3 4
Future<dynamic> joinGroup({
required String gid,
String? reason,
String? operationID,
int joinSource = 3,
}) =>
_channel.invokeMethod(
'joinGroup',
_buildParam({
'gid': gid,
'reason': reason,
'joinSource': joinSource,
'operationID': Utils.checkOperationID(operationID),
}));
@ -497,6 +500,54 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID),
}));
///
/// [groupID] ID
/// [status] 01
Future<dynamic> setGroupLookMemberInfo({
required String groupID,
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupLookMemberInfo',
_buildParam({
'groupID': groupID,
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
///
/// [groupID] ID
/// [status] 01
Future<dynamic> setGroupApplyMemberFriend({
required String groupID,
required int status,
String? operationID,
}) =>
_channel.invokeMethod(
'setGroupApplyMemberFriend',
_buildParam({
'groupID': groupID,
'status': status,
'operationID': Utils.checkOperationID(operationID),
}));
///
/// [groupId] ID
Future<List<GroupMembersInfo>> getGroupOwnerAndAdmin({
required String groupID,
String? operationID,
}) =>
_channel
.invokeMethod(
'getGroupMemberOwnerAndAdmin',
_buildParam({
'groupID': groupID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (map) => GroupMembersInfo.fromJson(map)));
static Map _buildParam(Map param) {
param["ManagerName"] = "groupManager";
return param;

@ -147,6 +147,11 @@ class IMManager {
Utils.toList(value, (map) => ReadReceiptInfo.fromJson(map));
messageManager.msgListener.recvGroupMessageReadReceipt(list);
break;
case 'onNewRecvMessageRevoked':
var value = call.arguments['data']['revokedMessageV2'];
var info = Utils.toObj(value, (map) => RevokedInfo.fromJson(map));
messageManager.msgListener.recvMessageRevokedV2(info);
break;
}
} else if (call.method == ListenerType.msgSendProgressListener) {
String type = call.arguments['type'];

@ -77,8 +77,9 @@ class MessageManager {
}))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
///
/// [revokeMessageV2]
/// [message]
@deprecated
Future revokeMessage({
required Message message,
String? operationID,
@ -686,6 +687,19 @@ class MessageManager {
}))
.then((value) => Utils.toList(value, (map) => Message.fromJson(map)));
///
/// [message]
Future revokeMessageV2({
required Message message,
String? operationID,
}) =>
_channel.invokeMethod(
'newRevokeMessage',
_buildParam(message.toJson()
..addAll({
"operationID": Utils.checkOperationID(operationID),
})));
static Map _buildParam(Map param) {
param["ManagerName"] = "messageManager";
return param;

@ -118,9 +118,16 @@ class ConversationInfo {
return data;
}
///
bool get isSingleChat => conversationType == ConversationType.single;
bool get isGroupChat => conversationType == ConversationType.group;
///
bool get isGroupChat =>
conversationType == ConversationType.group ||
conversationType == ConversationType.superGroup;
///
bool get isValid => isSingleChat || isGroupChat && !isNotInGroup!;
@override
bool operator ==(Object other) =>

@ -32,7 +32,7 @@ class GroupInfo {
/// ID
String? creatorUserID;
///
/// [GroupType]
int? groupType;
///
@ -41,6 +41,18 @@ class GroupInfo {
/// [GroupVerification]
int? needVerification;
/// 01
int? lookMemberInfo;
/// 01
int? applyMemberFriend;
///
int? notificationUpdateTime;
///
String? notificationUserID;
GroupInfo({
required this.groupID,
this.groupName,
@ -55,6 +67,10 @@ class GroupInfo {
this.groupType,
this.ex,
this.needVerification,
this.lookMemberInfo,
this.applyMemberFriend,
this.notificationUpdateTime,
this.notificationUserID,
});
GroupInfo.fromJson(Map<String, dynamic> json) : groupID = json['groupID'] {
@ -71,6 +87,10 @@ class GroupInfo {
groupType = json['groupType'];
ex = json['ex'];
needVerification = json['needVerification'];
lookMemberInfo = json['lookMemberInfo'];
applyMemberFriend = json['applyMemberFriend'];
notificationUpdateTime = json['notificationUpdateTime'];
notificationUserID = json['notificationUserID'];
}
Map<String, dynamic> toJson() {
@ -88,8 +108,17 @@ class GroupInfo {
data['groupType'] = this.groupType;
data['ex'] = this.ex;
data['needVerification'] = this.needVerification;
data['lookMemberInfo'] = this.lookMemberInfo;
data['applyMemberFriend'] = this.applyMemberFriend;
data['notificationUpdateTime'] = this.notificationUpdateTime;
data['notificationUserID'] = this.notificationUserID;
return data;
}
///
int get sessionType => groupType == GroupType.general
? ConversationType.group
: ConversationType.superGroup;
}
///
@ -112,7 +141,7 @@ class GroupMembersInfo {
///
int? joinTime;
///
/// 2 3 4
int? joinSource;
/// id
@ -123,8 +152,13 @@ class GroupMembersInfo {
/// s
int? muteEndTime;
///
int? appMangerLevel;
/// id
String? inviterUserID;
GroupMembersInfo({
this.groupID,
this.userID,
@ -137,6 +171,7 @@ class GroupMembersInfo {
this.operatorUserID,
this.muteEndTime,
this.appMangerLevel,
this.inviterUserID,
});
GroupMembersInfo.fromJson(Map<String, dynamic> json) {
@ -151,6 +186,7 @@ class GroupMembersInfo {
operatorUserID = json['operatorUserID'];
muteEndTime = json['muteEndTime'];
appMangerLevel = json['appMangerLevel'];
inviterUserID = json['inviterUserID'];
}
Map<String, dynamic> toJson() {
@ -166,6 +202,7 @@ class GroupMembersInfo {
data['operatorUserID'] = this.operatorUserID;
data['muteEndTime'] = this.muteEndTime;
data['appMangerLevel'] = this.appMangerLevel;
data['inviterUserID'] = this.inviterUserID;
return data;
}
}

@ -287,6 +287,14 @@ class Message {
faceElem = message.faceElem;
attachedInfoElem = message.attachedInfoElem;
}
///
bool get isSingleChat => sessionType == ConversationType.single;
///
bool get isGroupChat =>
sessionType == ConversationType.group ||
sessionType == ConversationType.superGroup;
}
///
@ -958,3 +966,71 @@ class AtUserInfo {
return data;
}
}
///
class RevokedInfo {
/// ID
String? revokerID;
/// [GroupRoleLevel]
int? revokerRole;
///
String? revokerNickname;
/// id
String? clientMsgID;
///
int? revokeTime;
///
int? sourceMessageSendTime;
///
String? sourceMessageSendID;
///
String? sourceMessageSenderNickname;
/// [ConversationType]
int? sessionType;
RevokedInfo({
this.revokerID,
this.revokerRole,
this.revokerNickname,
this.clientMsgID,
this.revokeTime,
this.sourceMessageSendTime,
this.sourceMessageSendID,
this.sourceMessageSenderNickname,
this.sessionType,
});
RevokedInfo.fromJson(Map<String, dynamic> json) {
revokerID = json['revokerID'];
revokerRole = json['revokerRole'];
revokerNickname = json['revokerNickname'];
clientMsgID = json['clientMsgID'];
revokeTime = json['revokeTime'];
sourceMessageSendTime = json['sourceMessageSendTime'];
sourceMessageSendID = json['sourceMessageSendID'];
sourceMessageSenderNickname = json['sourceMessageSenderNickname'];
sessionType = json['sessionType'];
}
Map<String, dynamic> toJson() {
final data = Map<String, dynamic>();
data['revokerID'] = this.revokerID;
data['revokerRole'] = this.revokerRole;
data['revokerNickname'] = this.revokerNickname;
data['clientMsgID'] = this.clientMsgID;
data['revokeTime'] = this.revokeTime;
data['sourceMessageSendTime'] = this.sourceMessageSendTime;
data['sourceMessageSendID'] = this.sourceMessageSendID;
data['sourceMessageSenderNickname'] = this.sourceMessageSenderNickname;
data['sessionType'] = this.sessionType;
return data;
}
}

@ -322,6 +322,13 @@ class FriendInfo {
data['ex'] = this.ex;
return data;
}
String getShowName() => _isNull(remark) ?? _isNull(nickname) ?? userID!;
static String? _isNull(String? value) {
if (value == null || value.trim().isEmpty) return null;
return value;
}
}
///

@ -2,7 +2,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OpenIM {
static const version = '2.1.0';
static const version = '2.3.0';
static const _channel = const MethodChannel('flutter_openim_sdk');

@ -1,6 +1,6 @@
name: flutter_openim_sdk
description: An instant messaging plug-in that supports Android and IOS. And the server is also all open source.
version: 2.2.0
version: 2.3.0
homepage: https://www.rentsoft.cn
repository: https://github.com/OpenIMSDK/Open-IM-SDK-Flutter

Loading…
Cancel
Save