Flutter技术问题:如何将API返回的Map数据转换为List类型
将AltinModel转换为List的实现方案
你的AltinModel包含多个同类型(The14AyarAltin)的属性,要把这些属性转换成List,最直接高效的方式有两种:
方法一:手动收集属性到列表
获取到AltinModel实例后,直接将所有The14AyarAltin类型的属性添加到List中:
// 获取数据 AltinModel altinData = await altinGetir(); // 转换为List<The14AyarAltin> List<The14AyarAltin> altinList = [ altinData.onsAltin, altinData.gramAltin, altinData.ceyrekAltin, altinData.yarimAltin, altinData.tamAltin, altinData.cumhuriyetAltini, altinData.ataAltin, altinData.resatAltin, altinData.hamitAltin, altinData.ikibucukAltin, altinData.gremseAltin, altinData.besliAltin, altinData.the14AyarAltin, altinData.the18AyarAltin, altinData.the22AyarBilezik, altinData.gumus, ];
方法二:在AltinModel中添加转换方法
为了代码复用和可读性,可以在AltinModel类内部添加一个方法,专门返回转换后的列表:
修改AltinModel类:
class AltinModel { // ... 原有属性、构造函数、fromJson/toJson方法不变 // 添加转换方法 List<The14AyarAltin> toAltinList() { return [ onsAltin, gramAltin, ceyrekAltin, yarimAltin, tamAltin, cumhuriyetAltini, ataAltin, resatAltin, hamitAltin, ikibucukAltin, gremseAltin, besliAltin, the14AyarAltin, the18AyarAltin, the22AyarBilezik, gumus, ]; } }
使用时只需调用该方法:
AltinModel altinData = await altinGetir(); List<The14AyarAltin> altinList = altinData.toAltinList();
可选:保留数据名称的扩展方案
如果需要同时保留每个数据对应的标识名称(比如"gram_altin"),可以创建一个辅助类来封装,再生成列表:
// 辅助类:封装名称和对应数据 class AltinNamedItem { final String identifier; final The14AyarAltin data; AltinNamedItem(this.identifier, this.data); } // 在AltinModel中添加对应方法 List<AltinNamedItem> toNamedAltinList() { return [ AltinNamedItem("ons_altin", onsAltin), AltinNamedItem("gram_altin", gramAltin), AltinNamedItem("ceyrek_altin", ceyrekAltin), AltinNamedItem("yarim_altin", yarimAltin), AltinNamedItem("tam_altin", tamAltin), AltinNamedItem("cumhuriyet_altini", cumhuriyetAltini), AltinNamedItem("ata_altin", ataAltin), AltinNamedItem("resat_altin", resatAltin), AltinNamedItem("hamit_altin", hamitAltin), AltinNamedItem("ikibucuk_altin", ikibucukAltin), AltinNamedItem("gremse_altin", gremseAltin), AltinNamedItem("besli_altin", besliAltin), AltinNamedItem("14_ayar_altin", the14AyarAltin), AltinNamedItem("18_ayar_altin", the18AyarAltin), AltinNamedItem("22_ayar_bilezik", the22AyarBilezik), AltinNamedItem("gumus", gumus), ]; }
注意事项
不推荐使用反射(如reflectable包)来自动遍历属性,因为Flutter默认禁用反射机制(为了优化打包体积),手动处理更符合Flutter的性能和打包规范。
内容的提问来源于stack exchange,提问作者yusuf
相关产品推荐
相关产品推荐

