Flutter如何在两个模型间共享数据 实现展示用户名而非用户ID
方案1(最优解:后端接口调整)
优先让接口返回Post数据时,把user字段从单纯的用户ID字符串,替换为完整的用户信息对象,这是性能最好、前端工作量最小的方案,避免前端额外发起多余的用户查询请求。
对应的前端代码修改如下:
修改Post模型
把user字段的类型从String改为User,调整fromJson和toJson方法:
class Post { // 原来的String user改成User类型 User user; String id; String title; String content; String address; String category; String price; String photo; Post( {required this.user, this.title, this.category, this.content, this.address, this.price, this.id, this.photo}); Post.fromJson(Map<String, dynamic> json) { id = json['_id']; title = json['title']; price = json['price']; // 直接把user字段反序列化为User对象 user = User.fromJson(json['user']); content = json['content']; category = json['category']; address = json['address']; photo = json['photo']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = new Map<String, dynamic>(); data['id'] = this.id; data['title'] = this.title; data['price'] = this.price; // 序列化时调用User的toJson方法 data['user'] = this.user.toJson(); data['content'] = this.content; data['category'] = this.category; data['address'] = this.address; return data; } }
页面展示代码修改
直接取user的name字段即可:
AutoSizeText( reversedList[index].user.name, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18), )
方案2(前端兼容方案:后端无法调整接口时使用)
如果后端没法改接口,前端可以提前拉取全量用户列表,转成ID到用户名的映射表,再通过Post里的userID匹配对应的用户名。
步骤1:构建用户ID映射表
在请求Post列表的同时请求用户列表,构建映射缓存:
// 提前请求获取所有用户数据List<User> userList Map<String, String> userIdToName = {}; for (var user in userList) { userIdToName[user.id] = user.name; }
步骤2:页面展示代码修改
通过映射表匹配用户名,匹配失败时显示兜底内容:
AutoSizeText( userIdToName[reversedList[index].user] ?? '未知用户', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18), )
注意:如果用户量很大不适合全量拉取,可以做按需请求+本地缓存:渲染Post时先查本地缓存有没有对应用户ID的信息,没有就发起单个用户信息查询,存到缓存后再更新UI,但这种方案会产生大量零散请求,优先选方案1。
内容的提问来源于stack exchange,提问作者Shahad Alharbi
相关产品推荐
相关产品推荐

