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

FL_Charts小屏幕底部标题重叠,添加横向滚动报错如何解决?

FL_Charts小屏幕标题重叠+横向滚动渲染错误解决

核心问题分析

你遇到的“Unsupported operation: Infinity or NaN toInt”错误,本质是FL_Charts在无宽度约束的横向滚动容器中,SideTitles组件计算布局时拿到了无限大的宽度值,导致整数转换失败。小屏幕标题重叠则是因为默认布局下底部标题空间不足,且无横向滚动能力。

解决方案步骤

1. 给图表设置明确宽度约束

直接把图表放在SingleChildScrollView里会导致图表宽度无限,必须用SizedBox或Container给图表指定明确宽度(可根据数据量动态计算):

SingleChildScrollView(
  scrollDirection: Axis.horizontal,
  child: SizedBox(
    // 按每个数据点分配60px宽度,可根据需求调整
    width: yourDataList.length * 60.0,
    height: 300, // 固定图表高度
    child: LineChart( // 或BarChart等你使用的图表类型
      // 图表配置
    ),
  ),
)

2. 优化底部标题布局

结合滚动能力,进一步调整bottomTitles配置避免重叠:

titlesData: FlTitlesData(
  bottomTitles: AxisTitles(
    sideTitles: SideTitles(
      showTitles: true,
      reservedSize: 35, // 增加底部预留空间,防止标题被截断
      interval: 1, // 数据量过大时可设为2/3,跳过部分标题
      getTitlesWidget: (value, meta) {
        return SideTitleWidget(
          axisSide: meta.axisSide,
          child: Text(
            yourDataList[value.toInt()].label,
            style: TextStyle(fontSize: 10), // 缩小字体适配小屏幕
            overflow: TextOverflow.ellipsis, // 超长标题显示省略号
          ),
        );
      },
    ),
  ),
  // 隐藏不需要的坐标轴标题
  leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
  topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
  rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
)

3. 排查数据有效性

确保你的图表数据中没有NaN或无限大数值,这类数据会导致坐标轴计算异常,触发同样的错误。可以在构建数据前做校验:

// 示例:过滤无效数据
final validData = yourDataList.where((item) => !item.value.isNaN && item.value.isFinite).toList();

完整示例代码

import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';

class ScrollableChart extends StatelessWidget {
  final List<ChartData> yourDataList;

  const ScrollableChart({super.key, required this.yourDataList});

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      scrollDirection: Axis.horizontal,
      child: SizedBox(
        width: yourDataList.length * 60.0,
        height: 300,
        child: LineChart(
          LineChartData(
            gridData: FlGridData(show: false),
            borderData: FlBorderData(show: true),
            titlesData: FlTitlesData(
              bottomTitles: AxisTitles(
                sideTitles: SideTitles(
                  showTitles: true,
                  reservedSize: 35,
                  interval: 1,
                  getTitlesWidget: (value, meta) {
                    return SideTitleWidget(
                      axisSide: meta.axisSide,
                      child: Text(
                        yourDataList[value.toInt()].label,
                        style: TextStyle(fontSize: 10),
                        overflow: TextOverflow.ellipsis,
                      ),
                    );
                  },
                ),
              ),
              leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
              topTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
              rightTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)),
            ),
            lineBarsData: [
              LineChartBarData(
                spots: yourDataList.map((e) => FlSpot(e.index.toDouble(), e.value)).toList(),
                isCurved: true,
                barWidth: 2,
                color: Colors.blue,
                dotData: FlDotData(show: true),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 示例数据模型
class ChartData {
  final int index;
  final String label;
  final double value;

  ChartData({required this.index, required this.label, required this.value});
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:41