首页 > 解决方案 > 如何避免基于 chart_flutter DateTime 的系列列表的运行时类型异常?

问题描述

我的模型:

class Record {
  final DateTime timeStamp;
  final int metric;
}

我想以最简单的方式展示一系列LineChart

List<Record> _sampledRecords;
...
@override
initState() {
  _sampledRecords = ...
}
...
              child: LineChart(
                [
                  Series<Record, DateTime>(
                    id: 'Metric 1',
                    colorFn: (_, __) =>
                        MaterialPalette.blue.shadeDefault,
                    domainFn: (Record record, _) => record.timeStamp,
                    measureFn: (Record record, _) => record.metric,
                    data: _sampledRecords,
                  ),
                ],
              ),

现在这与我看到的几个示例代码完全一致,比如查看https://google.github.io/charts/flutter/example/axes/nonzero_bound_measure_axis 显然,人数是那里的测量值(y 轴数据)并且DateTime是x 轴数据。我以完全相同的方式输入了我的用例,编译器也可以。

但是运行时我得到:type 'List<Series<Record, DateTime>>' is not a subtype of type 'List<Series<dynamic, num>>'. 系统从哪里提取这种num数字输入?我不能使用'List<Series<dynamic, dynamic>>' 类型的 Receiving runtime error is not a subtype of type 'List<Series<dynamic, num>>' charts_flutter(所以请意识到我的问题不是重复的)解决方案,因为DateTime不是num类型。我尝试将此作为澄清,但它没有改变任何东西:

              child: LineChart(
                <Series<Record, DateTime>>[
                  Series<Record, DateTime>(
                    id: 'Metric 1',
                    colorFn: (_, __) =>
                        MaterialPalette.blue.shadeDefault,
                    domainFn: (Record record, _) => record.timeStamp,
                    measureFn: (Record record, _) => record.metric,
                    data: _sampledRecords,
                  ),
                ],
              ),

我重构了这样的代码:

List<Series<Record, DateTime>> _getPowerData() {
  return [
    Series<Record, DateTime>(
      id: 'Metric 1',
      colorFn: (_, __) =>
      MaterialPalette.blue.shadeDefault,
      domainFn: (Record record, _) => record.timeStamp,
      measureFn: (Record record, _) => record.power,
      data: _sampledRecords,
    ),
  ];
}

              child: LineChart(_getPowerData()

我得到type 'List<Series<dynamic, dynamic>>' is not a subtype of type 'List<Series<dynamic, num>>'运行时异常。此外,我什至尝试通过以下方式满足num类型int

List<Series<Record, int>> _getPowerData() {
  return [
    Series<Record, int>(
      id: 'Metric 1',
      colorFn: (_, __) =>
      MaterialPalette.blue.shadeDefault,
      domainFn: (Record record, _) => record.seconds,
      measureFn: (Record record, _) => record.power,
      data: _sampledRecords,
    ),
  ];
}

但即使这样也会产生type 'List<Series<dynamic, dynamic>>' is not a subtype of type 'List<Series<dynamic, num>>'.

标签: fluttercharts

解决方案


问题是 simpleLineChart不适合处理时间序列数据。让我们以NonzeroBoundMeasureAxishttps://google.github.io/charts/flutter/example/axes/nonzero_bound_measure_axis)为例:它使用TimeSeriesChart. 所以我参加了一场摔跤比赛,LineChart而我应该选择一个更专业的图表(有多个),它支持基于时间序列的数据。


推荐阅读