Flutter: проблема с прокруткой анимации плагина pie_chart

У меня есть эта круговая диаграмма, созданная плагином Flutter pie_chart.

    return SizedBox(
            height: 150.0,
            child: Stack(
              children: [
                PieChart(
                  baseChartColor: AmbarColors.greyNoEvents,
                  totalValue: hoursSpent,
                  dataMap: dataMap,
                  // degreeOptions: const DegreeOptions(totalDegrees: 360, initialAngle: 0),
                  animationDuration: Duration(milliseconds: 2000),
                  chartLegendSpacing: 22,
                  chartRadius: MediaQuery.of(context).size.width / 3.2,
                  colorList: const [AmbarColors.backgroundGreen],
                  initialAngleInDegree: 0,
                  chartType: ChartType.ring,
                  ringStrokeWidth: 17,
                  centerText: '$percent%',
                  centerTextStyle: const TextStyle(
                      fontWeight: FontWeight.bold,
                      fontFamily: Fonts.satoshi,
                      fontSize: 30),
                  legendOptions: const LegendOptions(
                    showLegends: false,
                  ),

                  chartValuesOptions: const ChartValuesOptions(
                    showChartValueBackground: false,
                    showChartValues: false,
                    showChartValuesInPercentage: true,
                  ),
                  gradientList: gradientList,
                  // gradientList: ---To add gradient colors---
                  // emptyColorGradient: ---Empty Color gradient---
                )
              ],
            ));
      }

Проблема в том, что я помещаю диаграмму в область прокрутки. Вот результат:

График вращается каждый раз, когда я перемещаю мышь, и я не понимаю, почему.

Как я могу решить эту проблему?

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

Ответы 2

Возможно, это вызвано конфликтом между событием прокрутки и анимацией круговой диаграммы. График, вероятно, получает и реагирует на эти события прокрутки.

В качестве обходного пути/теста вы можете попробовать заблокировать распространение событий прокрутки на диаграмму.
Если вам нужно только отобразить диаграмму, и пользователям не нужно взаимодействовать с ней, вы можете попробовать обернуть виджет диаграммы виджетом IgnorePointer. Это предотвратит получение диаграммой событий указателя:

return SizedBox(
  height: 150.0,
  child: Stack(
    children: [
      IgnorePointer(
        child: PieChart(
          // Your PieChart properties...
        ),
      ),
    ],
  ),
);

Если вам нужно, чтобы пользователь мог взаимодействовать с диаграммой (например, если на диаграмме есть интерактивные элементы, такие как интерактивные легенды), вам может потребоваться другое решение.


Как уже отмечалось, в этом плагине IgnorePointer, похоже, не работает.

Ответ OP указывает на использование обходного пути, заключающего PieChart в SingleChildScrollView, физика прокрутки которого установлена ​​​​на NeverScrollableScrollPhysics.

SingleChildScrollView во Flutter — это виджет, который может содержать одно поле и позволяет его прокручивать. Это может быть полезно, когда у вас есть контент, который может превышать размер экрана, и вы хотите разрешить пользователю прокручивать его, чтобы увидеть его. Однако у него также есть свойства, управляющие поведением прокрутки.

NeverScrollableScrollPhysics — это тип ScrollPhysics, который предотвращает прокрутку прокрутки при взаимодействии с пользователем.

Таким образом, OP по существу обернул их PieChart в виде прокрутки, который нельзя прокручивать. Похоже, это предотвратило вращение диаграммы, когда она находится в области прокрутки, что позволяет предположить, что в плагине pie_chart может быть ошибка, которая вызывает неожиданное поведение, когда она помещена в прокручиваемый контекст.

Таким образом, SingleChildScrollView используется для переноса PieChart, а NeverScrollableScrollPhysics передается его свойству physics, что фактически делает PieChart непрокручиваемым и предотвращает нежелательное поведение вращения.

В этом плагине IgnorePointer, похоже, не работает, но это полезная информация для будущих проблем.

rafa_pe 02.06.2023 11:06

@rafa_pe Я отредактировал ответ, чтобы объяснить, почему ваш обходной путь работает.

VonC 02.06.2023 20:44
Ответ принят как подходящий

Наконец, я поставил SingleChildScrollView с никогда не прокручиваемой физикой. Это должно быть ошибка в плагине.

    return SizedBox(
              height: 180.0,
              child: Stack(
                children: [
                  SingleChildScrollView( //<!------in this point
                    physics: const NeverScrollableScrollPhysics(),
                    child: PieChart(
                      baseChartColor: Colors.greyNoEvents,
                      totalValue: hoursSpent,
                      dataMap: dataMap,
                      animationDuration: Duration(milliseconds: 2000),
                      chartLegendSpacing: 22,
                      chartRadius: MediaQuery.of(context).size.width / 3.2,
                      colorList: const [Colors.backgroundGreen],
                      initialAngleInDegree: 0,
                      chartType: ChartType.ring,
                      ringStrokeWidth: 17,
                      centerText: '$subsPercent%',
                      centerTextStyle: const TextStyle(
                          fontWeight: FontWeight.bold,
                          fontFamily: Fonts.satoshi,
                          fontSize: 30),
                      legendOptions: const LegendOptions(
                        showLegends: false,
                      ),

                      chartValuesOptions: const ChartValuesOptions(
                        showChartValueBackground: false,
                        showChartValues: false,
                        showChartValuesInPercentage: true,
                      ),
                      gradientList: gradientList,
                      // gradientList: ---To add gradient colors---
                      // emptyColorGradient: ---Empty Color gradient---
                    ),
                  )
                ],
              ),
        );
      }
            

Хороший улов, молодец.

VonC 02.06.2023 11:48

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