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
相关产品推荐
相关产品推荐

