重点是转字节和转模型的前后模型要一致,思路清晰
//cmd=2035 //关注消息广播
message OnFocusMsgMsg
{
RoomUserInfo fromUserInfo = 1; //送礼用户信息
RoomUserInfo toUserInfo = 2; //收礼用户信息
}
//info的模型,重点是userExtraInfo是字节类型
message RoomUserInfo
{
int64 userId = 1;
int32 role = 2; // 0-游客 1-普通用户 10-会员 50-管理员 51-管理员 80-官方人员 90-官方客服 100-官方超级管理员
bytes userExtraInfo = 3; // 用户附加信息(客户端自定义,为节省流量,请使用protobuf序列化后的二进制数据), 包括昵称、等级等非聊天室权限有关的信息
}
调用请求关注广播,那个模型是用$user_extra.UserExtraInfo,然后用.writeToBuffer()转成bytes
///请求关注广播
focusAnchor() {
//这个关注是用户观众给主播点关注
//观众信息
Uint8List fromUserData = $user_extra.UserExtraInfo(
userId: _int64('${myUserInfo?.userID}'),
nickname: myUserInfo?.nickName,
avatar: myUserInfo?.faceUrlThumb ?? myUserInfo?.faceUrl,
gender: myUserInfo?.gender,
age: UserInfoUtil().getAge(myUserInfo?.birthday ?? 0),
vip: myUserInfo!.isVip ? 1 : 0,
lang: myUserInfo?.userExpandInfo?.region,
wealthLeve: myUserInfo?.userExpandInfo?.wealth_level,
charmLeve: myUserInfo?.userExpandInfo?.charm_level)
.writeToBuffer();
//主播信息
Uint8List toUserData = $user_extra.UserExtraInfo(
userId: _int64('${
widget.anchorInfo?.userId ?? 0}'),
nickname: widget.anchorInfo?.anchorName ?? '',
avatar: widget.anchorInfo?.anchorAvatar ?? '',
charmLeve: int.parse(widget.anchorInfo?.anchorCharm ?? '0'))
.writeToBuffer();
RoomUserInfo fromUserInfo = RoomUserInfo(
userId: _int64('${myUserInfo?.userID}'),
role: 1,
userExtraInfo: fromUserData);
RoomUserInfo toUserInfo = RoomUserInfo(
userId: _int64('${myUserInfo?.userID}'),
role: 50,
userExtraInfo: toUserData);
WsRoomLinker.instance.focusMsgReq(fromUserInfo, toUserInfo);
}
收到回调时:
typedef LiveFocusMsgBack = Function($user_extra.UserExtraInfo fromUserInfo,
$user_extra.UserExtraInfo toUserInfo);
LiveFocusMsgBack? _focusMsgBack;
case WsMessageRoomCmd.ON_FOCUS_MSG:
//关注回调数据
//先整体解析
OnFocusMsgMsg onFocusMsgMsg = OnFocusMsgMsg.fromBuffer(wsMessage.body);
//回调内容
if (_focusMsgBack != null) {
_focusMsgBack!(
//当时是什么模型转成字节的,现在就用什么模型转回去,然后回调
$user_extra.UserExtraInfo.fromBuffer(
onFocusMsgMsg.fromUserInfo.userExtraInfo),
$user_extra.UserExtraInfo.fromBuffer(
onFocusMsgMsg.toUserInfo.userExtraInfo));
}
PrintUtil.prints(
'${
DirectMessageTip.focusAnchorTip} 回调关注者的信息${
onFocusMsgMsg.fromUserInfo.userId}');
break;
//接收广播消息,模型一致就可以了
WsRoomLinker.instance
.focusMsgMsg(($user_extra.UserExtraInfo fromUserInfo, $user_extra.UserExtraInfo toUserInfo) {
GroupUserBean userExtraInfo = addGroupUserBean(fromUserInfo);
//广播关注信息,插入一条消息
DirectTextMessageModel? directTextMessageModel =
DirectTextMessageModel(
userInfo: userExtraInfo, textContent: '关注了1');
Provider.of<DirectSeedingMessageListModel>(Global.appContext,
listen: false)
.insertMessage(4, directTextMessageModel: directTextMessageModel);
PrintUtil.prints(
'${
DirectMessageTip.focusAnchorTip} 接收回调 ${
fromUserInfo.userId}');
});