toScale method

BaseScale<dynamic, num> toScale(
  1. num rangeStart,
  2. num rangeEnd, [
  3. List<DynamicData>? dataSet
])

Implementation

BaseScale toScale(num rangeStart, num rangeEnd, [List<DynamicData>? dataSet]) {
  List<num> rangeValue = [rangeStart, rangeEnd];
  if (category) {
    return CategoryScale(categoryList, rangeValue, inverse);
  }
  List<DynamicData> ds = [];
  if (dataSet != null) {
    ds.addAll(dataSet);
  }
  ds.add(DynamicData(min));
  if (max != null) {
    ds.add(DynamicData(max));
  }
  if (timeRange != null) {
    ds.add(DynamicData(timeRange!.start));
    ds.add(DynamicData(timeRange!.end));
  }

  List<num> list = [];
  List<DateTime> timeList = [];
  if (dataSet != null) {
    for (var data in dataSet) {
      if (data.isString) {
        continue;
      }
      if (data.isNum) {
        list.add(data.data);
      } else if (data.isDate) {
        timeList.add(data.data);
      }
    }
  }

  if (type == AxisType.time) {
    if (timeList.isEmpty) {
      throw FlutterError('现有数据无法推导出坐标范围');
    }
    timeList.sort((a, b) {
      return a.millisecondsSinceEpoch.compareTo(b.millisecondsSinceEpoch);
    });
    DateTime start = timeList[0];
    DateTime end = timeList[timeList.length - 1];
    return TimeScale(timeSplitType, [start, end], rangeValue, inverse);
  }

  if (type == AxisType.value || type == AxisType.log) {
    List<num> v = extremes<num>(list, (p) => p);
    NiceScale step = NiceScale.nice(
      v[0],
      v[1],
      splitNumber,
      minInterval: minInterval,
      maxInterval: maxInterval,
      interval: interval,
      start0: start0,
      type: niceType,
    );
    return LinearScale([step.start, step.end], rangeValue, inverse, step.tickCount);
  }

  throw FlutterError('现有数据无法推导出Scale');
}