Flutter中如何将API返回的字符串数组转为可遍历数组?
解决方案
你的问题出在错误地将字符串拆分为字符列表,而非解析JSON结构。直接用replaceAll去引号再调用toList(),只会把字符串拆成单个字符的数组,完全达不到解析成对象列表的目的。正确做法是使用Dart的JSON解析工具处理:
步骤1:导入JSON解析库
在文件顶部导入dart:convert:
import 'dart:convert';
步骤2:将非标准JSON字符串转为标准格式并解析
你拿到的字符串"[{id: 15}, {id: 150}]"不是标准JSON(标准JSON要求键必须用双引号包裹),所以需要先把键名加上双引号,再用jsonDecode解析为List:
修改fetchSaleDetails方法中的处理逻辑:
fetchSaleDetails() async { var response = await SaleRepository().showSale(widget.saleId); if (response['result'] == true) { setState(() { saleDetails = response['sales']; // 处理items字符串:给所有键名加上双引号,转为标准JSON String rawItems = saleDetails['items']; String standardJson = rawItems.replaceAll(RegExp(r'(\w+):'), r'"$1":'); // 解析为List<Map> saleDetails['items'] = jsonDecode(standardJson); saleDetailsFetched = true; }); } else { showToast("Something went wrong", context); } }
步骤3:正常遍历解析后的列表
现在saleDetails['items']已经是List<Map>类型,可以直接用ListView.builder遍历:
Container( height: 250, child: ListView.builder( itemCount: saleDetails['items'].length, itemBuilder: (context, index) { var item = saleDetails['items'][index]; return Container( padding: EdgeInsets.symmetric(vertical: 8), child: Text('商品ID: ${item['id']}'), ); }, ), )
补充说明
如果你的接口后续能返回标准JSON格式(比如"[{\"id\": 15}, {\"id\": 150}]"),可以跳过键名替换的步骤,直接调用jsonDecode(saleDetails['items'])即可。
内容的提问来源于stack exchange,提问作者Ishant Singh
相关产品推荐
相关产品推荐

