如何将SQL返回的映射列表转换为Dart纯名称列表?
如何将SQL返回的映射列表转换为Dart纯名称列表?
看起来你现在卡在把SQL返回的带键的映射列表转成纯名称列表这一步了,我来帮你捋捋问题出在哪~
你当前的代码里,indata应该是一个包含多个Map的列表(比如List<Map<String, dynamic>>),但你用asMap()把它转成了以索引为键的新映射,然后forEach的时候直接把整个value(也就是每个{"name": "xxx"}的完整映射)转成字符串塞进了fromSql,这当然和原数据没区别啊——你根本没提取到映射里的name值!
给你两种简单的解决方法,选你顺手的来:
方法一:用map方法(最简洁)
这是Dart里处理列表转换最常用的方式,一行就能搞定:
Future<void> fetchfromSql() async { final indata = await _crud.getNames(); print(indata); // 遍历每个映射,提取name字段,再转成列表 fromSql = indata.map((item) => item['name'] as String).toList(); // 如果你想过滤掉空字符串(比如你数据里那个""),可以再加个过滤: // fromSql = indata.map((item) => item['name'] as String).where((name) => name.isNotEmpty).toList(); print(fromSql); }
原理很简单:map会遍历列表里的每个元素(每个都是带name键的映射),把每个元素转换成对应的name值,最后用toList()把Iterable转换成List类型。
方法二:修改你原有的forEach写法
如果你习惯用循环的方式,那直接遍历原列表就行,完全没必要转成asMap():
Future<void> fetchfromSql() async { final indata = await _crud.getNames(); fromSql = []; print(indata); // 直接遍历indata里的每个映射元素 for (final item in indata) { // 提取当前映射里的name值 final name = item['name'] as String; fromSql.add(name); // 同样,要过滤空值的话就加个判断:if (name.isNotEmpty) fromSql.add(name); } print(fromSql); }
核心问题就是你之前没有深入到每个映射内部去取name字段,而是把整个映射对象转成字符串添加了,现在调整后就能得到你想要的纯名称列表啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

