flutter 字节和模型的转换

重点是转字节和转模型的前后模型要一致,思路清晰

//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}');
    });

猜你喜欢

转载自blog.csdn.net/weixin_44911775/article/details/129671569
今日推荐