【问题标题】:Flutter Linechart Widget not rebuilding on Data Changes with Provider using Change NotifierFlutter Linechart 小部件未使用更改通知程序通过提供程序重建数据更改
【发布时间】:2020-07-15 03:47:18
【问题描述】:

我目前有一个带有线图小部件的屏幕,这是一个使用 Flchart 插件的无状态小部件

折线图的数据源正在使用一个正在侦听更改的提供程序,我还有一个日期过滤器,它调用 api 并获取该日期范围的数据并刷新数据

我发现当我刷新不同日期范围的数据时,我可以看到数据正在发送到小部件但折线图未呈现/重建,如果我切换回默认日期范围第一个加载的图表显示正确。

折线图小部件

class LineChartWidget extends StatelessWidget {
  final List<FlSpot> list;
  final bool isDollar;
  LineChartWidget({this.list, this.isDollar});

  final DateTime now = DateTime.now();
  double minY = 0;
  double maxY = 0;

  @override
  Widget build(BuildContext context) {
    list.forEach((f) => print(f.y.toString()));
    return list.isEmpty
        ? Container(
            child: Center(
              child: Text("No Chart Data..."),
            ),
          )
        : ConstrainedBox(
            constraints: BoxConstraints.expand(height: 140),
            child: LineChart(mainData()),
          );
  }

  static int dse2mse(double daysSinceEpoch) {
    return (daysSinceEpoch * 86400000).floor();
  }

  static double mse2dse(int millisecondsSinceEpoch) {
    return millisecondsSinceEpoch / 86400000;
  }

  String getTitleFunction(double value) {
    DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(dse2mse(value));
    return DateFormat('MMM d').format(dateTime);
  }

  LineChartData mainData() {
    maxY = list[0].y;
    minY = list[0].y;
    list.forEach((i) {
      if (i.y < minY) {
        minY = i.y;
      }
      if (i.y > maxY) {
        maxY = i.y;
      }
    });

    return LineChartData(
      minX: mse2dse(DateTime(now.year, now.month, 1).millisecondsSinceEpoch),
      maxX: mse2dse(now.millisecondsSinceEpoch),
      minY: minY - 1.9 * minY,
      maxY: maxY + 0.2 * maxY,
      clipToBorder: true,
      gridData: FlGridData(
        show: false,
      ),
      titlesData: FlTitlesData(
        show: false,
      ),
      borderData: FlBorderData(
        show: false,
      ),
      lineTouchData: LineTouchData(
          fullHeightTouchLine: false,
          handleBuiltInTouches: true,
          getTouchedSpotIndicator:
              (LineChartBarData barData, List<int> spotIndexes) {
            return spotIndexes.map((spotIndex) {
              final FlSpot spot = barData.spots[spotIndex];
              if (spot.x == 0 || spot.x == 30 || spot.x == 29) {
                return null;
              }
              return TouchedSpotIndicatorData(
                const FlLine(color: Colors.transparent, strokeWidth: 0),
                const FlDotData(
                    dotSize: 5, dotColor: Color.fromRGBO(253, 54, 94, 1)),
              );
            }).toList();
          },
          touchTooltipData: LineTouchTooltipData(
              tooltipBgColor: Colors.white,
              fitInsideHorizontally: true,
              fitInsideVertically: true,
              getTooltipItems: (List<LineBarSpot> touchedBarSpots) {
                return touchedBarSpots.map((barSpot) {
                  final flSpot = barSpot;
                  if (flSpot.x == 0 || flSpot.x == 30 || flSpot.x == 29) {
                    return null;
                  }

                  return LineTooltipItem(
                    isDollar
                        ? '${getTitleFunction(flSpot.x)}  |  \$${flSpot.y}'
                        : '${getTitleFunction(flSpot.x)}  |  ${flSpot.y.toStringAsFixed(0)}',
                    const TextStyle(
                        color: Colors.black87,
                        fontFamily: 'NeueMontreal',
                        letterSpacing: 0.9,
                        fontWeight: FontWeight.w600,
                        fontSize: 12),
                  );
                }).toList();
              })),
      lineBarsData: [
        LineChartBarData(
          spots: list,
          isCurved: true,
          colors: [Color.fromRGBO(253, 54, 94, 1)],
          curveSmoothness: 0.17,
          barWidth: 1,
          isStrokeCapRound: true,
          dotData: const FlDotData(
            show: false,
          ),
        ),
      ],
    );
  }
}

我不确定将线图小部件更改为有状态是否会有所帮助,因为我无法调用 setstate,因为 NotifyListers 正在自动刷新数据

谢谢

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    解决了折线图不更新的问题,当日期范围发生变化时,MinX 和 MaxX 值需要更新

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 2022-11-12
      • 2021-08-17
      • 2021-10-01
      • 2022-01-08
      • 2021-08-12
      • 2015-09-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多