Flutter动态添加元素的列表访问id字段触发NoSuchMethodError报错
解决方案
方法1:直接使用Map键访问语法
你向likesCount里添加的是Map对象,Dart中Map的键不能通过.语法访问,必须用[]来获取对应值。修改访问代码:
if(likesCount.isNotEmpty){ for(var m=0;m<likesCount.length;m++){ // 转成String适配Text组件的参数要求 Text(likesCount[m]['id'].toString()) } }
如果postId本身是字符串类型,也可以直接强转:
Text(likesCount[m]['id'] as String)
方法2:使用自定义类实现类型安全(推荐)
用Map存储数据缺乏类型检查,容易引发隐性错误,更规范的方式是定义一个数据类:
class PostLikeData { final int likeCount; final String postId; final int index; PostLikeData({ required this.likeCount, required this.postId, required this.index, }); }
然后初始化列表时指定类型,并添加类实例:
// 指定列表类型为PostLikeData List<PostLikeData> likesCount = []; for(var j=0;j<snapshot.data!.length;j++){ likesCount.add(PostLikeData( likeCount: snapshot.data![j].likes!.length, postId: snapshot.data![j].postId, index: j, )); }
现在就能正常用.语法访问属性了:
if(likesCount.isNotEmpty){ for(var m=0;m<likesCount.length;m++){ Text(likesCount[m].postId) } }
问题原因
你初始化的likesCount是无类型列表,添加的元素是_InternalLinkedHashMap实例。Dart中Map没有.id这样的实例getter,必须通过键名用[]取值;而自定义类可以通过成员变量的getter用.访问,同时还能获得编译时类型检查,避免后续出错。
内容的提问来源于stack exchange,提问作者Jeevan Shrestha
相关产品推荐
相关产品推荐

