描述
使用 Flutter 5.4.0 以上版本,无法创建和发送 RCIMIWCommandNotificationMessage (命令消息)和 RCIMIWCommandNotificationMessage(命令通知消息)类型的消息。
分析
Flutter SDK 目前不提供命令消息( RCIMIWCommandNotificationMessage )和命令通知消息(RCIMIWCommandNotificationMessage)的 create 方法,如需要在客户端发送此消息,需要在 Flutter 层先定义此消息的包装类。该方式仅支持 5.4.0 及以上版本。
具体参考下面内容进行处理。
解决方案
创建命令消息
-
首先在 Flutter 层定义此消息, 创建
wrapper_command_message.dart
import 'package:rongcloud_im_wrapper_plugin/rongcloud_im_wrapper_plugin.dart'; import 'dart:convert' as json_lib show json; // 自定义消息需要继承 RCIMIWUserCustomMessage // class RCIMDCommandMessage extends RCIMIWUserCustomMessage { String? name; String? data; // 1. 定义自己的构造方法,需要调用父类的 RCIMIWUserCustomMessage(RCIMIWConversationType type, String targetId) RCIMDCommandMessage(RCIMIWConversationType type, String targetId, this.name, this.data) : super(type, targetId); // 2. 需要继承父类的构造函数 RCIMDCommandMessage.fromJson(Map<String, dynamic> json) : super.fromJson(json); // 3. 需要实现父类的 decode/encode/messageObjectName @override void decode(String jsonStr) { Map map = json_lib.json.decode(jsonStr.toString()); // 获取的 key 值要与原生传递的 key 值一样 name = map['name']; name = map['data']; } @override String encode() { Map map = {}; // 传递的 key 值要与原生传递的 key 值一样 map['name'] = name; map['data'] = data; return json_lib.json.encode(map); } @override String messageObjectName() { return "RC:CmdMsg"; } // 4. 需要实现父类的 toJson @override Map<String, dynamic> toJson() { final Map<String, dynamic> json = super.toJson(); // 此处 'content' 不可修改 json['content'] = encode(); return json; } }
-
在项目的原生层进行注册
iOS:
xxxx/ios/Runner/AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; NSMutableArray *marr = [NSMutableArray arrayWithObjects:[RCDPokeMessage class], [RCCommandMessage class], nil]; [RCIMWrapperEngine sharedInstance].messageContentClassList = marr.copy; ... }
Android:
example/android/app/src/main/java/cn/rongcloud/im/wrapper/flutter/example/MainActivity.java
public class MainActivity extends FlutterActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); List<Class<? extends MessageContent>> list = new ArrayList<>(); list.add(PokeMessage.class); list.add(CommandMessage.class); RCIMWrapperEngine.getInstance().messageContentClassList = list; } }
发送命令消息
RCIMDCommandMessage msg = RCIMDCommandMessage(type, targetId, "name", "data");
_sendMessage(msg, useCallback);
收到的消息和发送成功之后的消息都会处理为 RCIMIWCommandMessage
。 其他使用此消息的位置例如接收消息,只需处理 RCIMIWCommandMessage
即可。
如有疑问,欢迎提交工单。