You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter图表插入数据解析错误:List类型不匹配问题求助

问题解决:Flutter解析CoinGecko JSON到图表时的类型转换错误

问题原因

直接将jsonDecode(request.body)['prices']强转为List<List<dynamic>>会触发类型错误——JSON解码后返回的是List<dynamic>,Dart无法直接确认内部每个元素都是List类型,导致强制转换失败。

解决方案

1. 安全转换列表类型

遍历prices列表,将每个元素显式转换为List<dynamic>,确保类型安全:

final data = jsonDecode(request.body)['prices'] as List;
List<List<dynamic>> chartData = data.map((item) => item as List<dynamic>).toList();

2. 优化数据适配图表(可选)

CoinGecko返回的prices中,第一个元素是毫秒级时间戳,第二个是价格,可将时间戳转为DateTime方便图表展示:

List<List<dynamic>> formattedChartData = chartData.map((item) {
  return [
    DateTime.fromMillisecondsSinceEpoch(item[0]),
    item[1] as double,
  ];
}).toList();

3. 修正图表Series的泛型定义

给charts.Series指定明确的泛型参数,避免类型歧义:

series = [
  charts.Series<List<dynamic>, DateTime>(
    id: "crypto price",
    data: formattedChartData, // 或直接使用未格式化的chartData
    labelAccessorFn: (series, _) => '\$${series[1].toStringAsFixed(2)}',
    domainFn: (series, _) => series[0] as DateTime,
    measureFn: (series, _) => series[1] as double,
    colorFn: (series, _) => charts.ColorUtil.fromDartColor(Colors.blue),
  )
];

完整修正后的代码示例

final request = await http.get(Uri.parse(getMarketData(1, 'bitcoin')));

if (request.statusCode ~/ 100 == 4 || request.statusCode ~/ 100 == 5) {
  throw Exception('Request failed');
}

// 安全转换类型
final rawPrices = jsonDecode(request.body)['prices'] as List;
List<List<dynamic>> chartData = rawPrices.map((item) => item as List<dynamic>).toList();

// 格式化时间戳为DateTime(可选)
List<List<dynamic>> formattedChartData = chartData.map((item) {
  return [
    DateTime.fromMillisecondsSinceEpoch(item[0]),
    item[1] as double,
  ];
}).toList();

series = [
  charts.Series<List<dynamic>, DateTime>(
    id: "crypto price",
    data: formattedChartData,
    labelAccessorFn: (series, _) => '\$${series[1].toStringAsFixed(2)}',
    domainFn: (series, _) => series[0] as DateTime,
    measureFn: (series, _) => series[1] as double,
    colorFn: (series, _) => charts.ColorUtil.fromDartColor(Colors.blue),
  )
];

内容的提问来源于stack exchange,提问作者Davy King

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:40:29