Flutter中使用SignalR将MsgPack转为指定对象的方法
在Flutter中解析SignalR Msgpack嵌套数组为指定对象结构
你可以通过定义数据模型类+手动解析嵌套数组的方式完成转换,具体步骤如下:
1. 定义对应的数据模型
首先创建两个Dart类,分别对应目标结构的外层对象和内层item对象,注意userID带前导0,需用字符串类型避免丢失格式:
class UserItem { final int id; final int idReferent; final String userID; final String firstName; final String lastName; UserItem({ required this.id, required this.idReferent, required this.userID, required this.firstName, required this.lastName, }); // 从子数组转成UserItem实例 factory UserItem.fromList(List<dynamic> list) { return UserItem( id: list[0] as int, idReferent: list[1] as int, userID: list[2].toString(), firstName: list[3] as String, lastName: list[4] as String, ); } } class ResponseData { final int id; final UserItem item; ResponseData({ required this.id, required this.item, }); // 从外层数组转成ResponseData实例 factory ResponseData.fromList(List<dynamic> list) { return ResponseData( id: list[0] as int, item: UserItem.fromList(list[1] as List<dynamic>), ); } }
2. 在SignalR消息回调中解析数据
当通过signalr_netcore接收到Msgpack格式的消息时,直接将回调参数传入模型的fromList方法即可完成转换:
hubConnection.on("你的消息名称", (arguments) { // 假设arguments[0]是收到的嵌套数组 final rawData = arguments[0] as List<dynamic>; final responseData = ResponseData.fromList(rawData); // 直接使用强类型对象的字段 print(responseData.item.firstName); // 输出Hoàng });
3. (可选)直接转为Map格式
如果不需要强类型模型,也可以直接将数组转为目标结构的Map:
hubConnection.on("你的消息名称", (arguments) { final rawData = arguments[0] as List<dynamic>; final result = { 'id': rawData[0], 'item': { 'id': rawData[1][0], 'idReferent': rawData[1][1], 'userID': rawData[1][2].toString(), 'firstName': rawData[1][3], 'lastName': rawData[1][4], } }; // 使用转换后的Map结构 });
注意:如果Msgpack解析后的数据类型有差异(比如某些字段是String而非int),需要在转换时做对应的类型适配,避免类型转换异常。
内容的提问来源于stack exchange,提问作者Trần Văn Hiếu
相关产品推荐
相关产品推荐

