Flutter:jsonData判定为List<dynamic>失败,数据无法显示求助
问题解决:Flutter无法解析MySQL返回的JSON数据
核心原因
第一个print(response.body)能执行,但jsonData is List<dynamic>判断不成立,说明接口返回的JSON结构不是直接的数组,而是带外层键的对象(Map类型),导致无法进入分支返回有效数据,最终屏幕无内容展示。
排查与解决步骤
- 确认返回的JSON结构
查看第一个print输出的response.body内容,常见的非直接数组格式示例:
{"code":200,"data":[{"ProjectName":"项目A","TransactionDate":"2024-05-01"},{"ProjectName":"项目B","TransactionDate":"2024-05-02"}]}
这种情况下,jsonDecode后的结果是Map<String, dynamic>,而非直接的List,所以原判断逻辑不生效。
- 修改Flutter解析逻辑
根据实际JSON结构调整代码,以带data键的对象为例,修改fetchData方法:
Future<List<dynamic>> fetchData() async { final response = await http.get(Uri.parse('http://10.0.2.2/myDashFolder/collections_fetch.php')); if (response.statusCode == 200) { try { final jsonData = jsonDecode(response.body); print(response.body); // 适配外层为Map的情况 if (jsonData is Map<String, dynamic>) { final dataList = jsonData['data']; if (dataList is List<dynamic>) { print('有效数据列表: $dataList'); return dataList; } } // 兼容直接返回数组的情况 else if (jsonData is List<dynamic>) { print(response.body); return jsonData; } } catch (e) { print('Failed to decode JSON: $e'); } } return []; }
- 添加调试辅助
在解析后打印数据类型,快速定位问题:
final jsonData = jsonDecode(response.body); print('jsonData类型: ${jsonData.runtimeType}');
- 检查PHP端输出
确保PHP脚本返回的JSON格式符合预期:
- 若要直接返回数组,PHP代码示例:
$result = mysqli_query($conn, "SELECT * FROM Collections"); $rows = mysqli_fetch_all($result, MYSQLI_ASSOC); echo json_encode($rows); - 若返回带外层包装的对象,需保证键名与Flutter端解析时一致。
内容的提问来源于stack exchange,提问作者Anirban Sen
相关产品推荐
相关产品推荐

