Я пытаюсь сделать TimeSeriesChart с осью Y (вертикальная ось) с пользовательскими метками.
Я могу убедиться, что строки ('final List<dynamic> string = data.data['options'];
') содержат ожидаемые значения. И я даже могу ссылаться на них как на строки[0], но когда я это делаю strings[value.toInt()]
, выдается RangeError
.
См. этот фрагмент кода.
Там, где я инициализирую «окончательную метку», у меня есть две строки кода, определяющие BasicNumericTickFormatterSpec
.
Первая строка - это то, что я пытаюсь сделать. Я хочу использовать value
для поиска строки в strings[]
.
Я могу сделать ((num value) => 'MyValue: ${string[0]}')
, который отлично работает.
Я могу сделать ((num value) => 'MyValue: ${string}')
просто для вывода всех значений на каждом «шаге».
Таким образом, в основном я могу убедиться, что string
действительно содержит ожидаемые значения, и я могу получить доступ к значениям, но если я попытаюсь найти значение, ((num value) => 'MyValue: ${string[value.toInt()]}')
тогда он сломается с этим RangeError.
Widget _buildChart(BuildContext context, DocumentSnapshot data) {
final List<dynamic> string = data.data['options'];
final labels =
charts.BasicNumericTickFormatterSpec((num value) => 'MyValue: ${string[value.toInt()]}');
// charts.BasicNumericTickFormatterSpec((num value) => 'MyValue: ${string[0]}')
var chart = charts.TimeSeriesChart(seriesList,
// Sets up a currency formatter for the measure axis.
primaryMeasureAxis: new charts.NumericAxisSpec(tickFormatterSpec: labels),
animate: animate,
// Optionally pass in a [DateTimeFactory] used by the chart. The factory
// should create the same type of [DateTime] as the data provided. If none
// specified, the default creates local date time.
dateTimeFactory: const charts.LocalDateTimeFactory());
return new Padding(
padding: new EdgeInsets.all(10.0),
child: new SizedBox(
height: 200.0,
child: chart,
));
}
Я ожидал, что каждое «значение», которое я поместил в ((num value) => '$strings[value.toInt()])
, вернет строку из strings[].
Вместо этого я получаю:
flutter: The following RangeError was thrown during performLayout(): flutter: RangeError (index): Invalid value: Not in range 0..1, inclusive: 2
Да, это было бы очевидным (или разумным) объяснением. Что меня беспокоит, так это то, что я могу проверить необходимые «галочки» и совпадение доступных меток.
Есть ли прогресс в поиске проблемы?
К сожалению, нет решения, но я попробую вашу диагностику сегодня вечером. У меня не было времени, на которое я надеялся. Одна вещь, которую я нашел в Интернете, заключается в том, что ошибка обычно связана с ListView.builder(), в конструктор которого не передается параметр itemCount. Так что, возможно, внутри упаковки что-то пошло не так. Дальше не исследовал.
Попробуйте расширить закрытие средства форматирования тиков, чтобы получить больше диагностики:
final labels = charts.BasicNumericTickFormatterSpec((num value) {
var index = value.floor();
print('--- tick for $value in $string with $index ---');
return (index < string.length)
? 'MyValue: ${string[index]}'
: 'overflow ${string.length} $index';
});
Я предполагаю, что диаграмма выяснила, что ей нужны отметки по оси Y, скажем, 0, 1 и 2. Поэтому она вызывает закрытие спецификации форматирования, чтобы отформатировать отметку «2», но ваш список labels недостаточно длинный (не содержит 2).