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

Flutter对接JSON API实现折线图适配新JSON格式代码修改咨询

适配新JSON格式的修改方案

核心修改围绕新JSON结构调整解析逻辑即可,新返回的JSON数组仅包含1个对象,对象的键为日期、值为对应价格,无需保留原有针对date/price字段的解析逻辑。

具体修改点

1. 重写loadSalesData解析逻辑

调整遍历规则,直接取数组第一个元素的键值对生成SalesData实例,同时新增清空旧数据的逻辑避免重复加载数据叠加:

Future<void> loadSalesData() async {
  // 加载前清空历史数据
  chartData.clear();
  final String jsonString = await getJsonFromFirebase(productasin);
  final dynamic jsonResponse = json.decode(jsonString);
  // 取数组首位的日期-价格映射表
  final Map<String, dynamic> datePriceMap = jsonResponse[0];
  // 遍历所有键值对生成图表数据
  datePriceMap.forEach((date, price) {
    chartData.add(SalesData(
      date,
      double.parse(price.toString()),
    ));
  });
  // 可选:按日期排序,避免API返回键顺序混乱导致折线异常
  chartData.sort((a, b) => a.date.compareTo(b.date));
}

2. 修正FutureBuilder冗余请求问题

原有代码中FutureBuilder和loadSalesData会重复发起两次API请求,直接将future替换为loadSalesData即可:

child: FutureBuilder(
  future: loadSalesData(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      return SfCartesianChart(
        trackballBehavior: _trackballBehavior,
        primaryXAxis: CategoryAxis(
          majorGridLines: MajorGridLines(width: 0),
          axisLine: AxisLine(width: 0),
        ),
        primaryYAxis: NumericAxis(
          edgeLabelPlacement: EdgeLabelPlacement.shift,
          majorGridLines: MajorGridLines(width: 0),
          axisLine: AxisLine(width: 0)),
        tooltipBehavior: _tooltipBehavior,
        series: <ChartSeries<SalesData, String>>[
          StackedAreaSeries<SalesData, String>(
            dataLabelSettings: DataLabelSettings(
              isVisible: true,
              labelAlignment: ChartDataLabelAlignment.top,
              useSeriesColor: true,
              showCumulativeValues: true,
            ),
            name: 'Price',
            dataSource: chartData,
            borderColor: Colors.white,
            borderWidth: 2,
            xValueMapper: (SalesData sales, _) => sales.date,
            yValueMapper: (SalesData sales, _) => sales.price,
            markerSettings: MarkerSettings(isVisible: true)
          )
        ]);
    } else {
      return Center(child: CircularProgressIndicator());
    }
  }
),

3. 可选冗余代码清理

原有SalesData的fromJson工厂方法现在已经不需要使用,可以直接删除,不影响功能运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:12:01