Добавление пользовательского primaryMeasureAxis с диаграммами Flutter

Я пытаюсь сделать 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

Я предполагаю, что диаграмма выяснила, что ей нужны отметки по оси Y, скажем, 0, 1 и 2. Поэтому она вызывает закрытие спецификации форматирования, чтобы отформатировать отметку «2», но ваш список labels недостаточно длинный (не содержит 2).

Richard Heap 28.05.2019 20:46

Да, это было бы очевидным (или разумным) объяснением. Что меня беспокоит, так это то, что я могу проверить необходимые «галочки» и совпадение доступных меток.

Anders Møller Pedersen 30.05.2019 11:31

Есть ли прогресс в поиске проблемы?

Richard Heap 07.06.2019 13:47

К сожалению, нет решения, но я попробую вашу диагностику сегодня вечером. У меня не было времени, на которое я надеялся. Одна вещь, которую я нашел в Интернете, заключается в том, что ошибка обычно связана с ListView.builder(), в конструктор которого не передается параметр itemCount. Так что, возможно, внутри упаковки что-то пошло не так. Дальше не исследовал.

Anders Møller Pedersen 18.06.2019 15:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
1 580
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте расширить закрытие средства форматирования тиков, чтобы получить больше диагностики:

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';
});

Другие вопросы по теме