Flutter调用古兰经API报错:_InternalLinkedHashMap无法转为Iterable
问题排查:古兰经API数据解析的TypeError错误
问题概述
开发一款支持古兰经与圣经阅读的APP,从Firebase拉取章节列表,通过API获取章节内容。圣经功能正常,但获取古兰经API返回的verses数据时,触发错误:
_TypeError (type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>')
错误原因
从API返回结构可以看到,verses是键值对格式的Map(键为经文序号1、2...),而代码中直接用for (var item in map["verses"])尝试遍历Map。在Dart里,Map本身不属于Iterable类型,不能直接用这种方式循环,因此抛出类型不匹配的错误。
修复方案
需要将Map类型的verses转换为可遍历的List,同时为了保证经文顺序正确,建议先对Map的键(经文序号)进行排序,再按顺序提取对应的数据。
代码修改示例
修改getQuran方法中的数据解析部分:
Future<List<Map<String, dynamic>>> getQuran(String surah) async { var uri = Uri.https( 'ajith-holy-bible.p.rapidapi.com', '/${surah}', ); var response = await http.get(uri, headers: { 'X-RapidAPI-Key': 'd88d0a8158mshb8b539da6b34179p137959jsn31258093d5c2', 'X-RapidAPI-Host': 'al-quran1.p.rapidapi.com' }); print(response.statusCode); print(response.body); Map<String, dynamic> map = jsonDecode(response.body); List<Map<String, dynamic>> myData = []; // 提取verses的Map结构 Map<String, dynamic> versesMap = map["verses"]; // 将键转换为整数并排序,确保经文按顺序排列 List<int> sortedVerseNumbers = versesMap.keys .map((key) => int.parse(key)) .toList() ..sort(); // 按排序后的序号提取经文数据 for (int number in sortedVerseNumbers) { myData.add(versesMap[number.toString()]); } return myData; }
额外优化点(解决潜在滚动冲突)
在SurahReading页面的嵌套ListView.builder中,添加以下属性避免内外ListView的滚动冲突:
return Container( child: ListView.builder( shrinkWrap: true, // 适配父容器高度 physics: NeverScrollableScrollPhysics(), // 禁用自身滚动,由外层SingleChildScrollView控制 itemCount: quran.length, itemBuilder: (context, index) { return Row( children: [ Center( child: Text( quran[index]["content"], style: TextStyle(fontSize: 15), ), ), Center( child: Text( quran[index]["translation_eng"], style: TextStyle(fontSize: 15), ), ), ], ); }, ), );
内容的提问来源于stack exchange,提问作者yuso
相关产品推荐
相关产品推荐

