У меня есть эта круговая диаграмма, созданная плагином 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---
)
],
));
}
Проблема в том, что я помещаю диаграмму в область прокрутки. Вот результат:
График вращается каждый раз, когда я перемещаю мышь, и я не понимаю, почему.
Как я могу решить эту проблему?





Возможно, это вызвано конфликтом между событием прокрутки и анимацией круговой диаграммы. График, вероятно, получает и реагирует на эти события прокрутки.
В качестве обходного пути/теста вы можете попробовать заблокировать распространение событий прокрутки на диаграмму.
Если вам нужно только отобразить диаграмму, и пользователям не нужно взаимодействовать с ней, вы можете попробовать обернуть виджет диаграммы виджетом 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 непрокручиваемым и предотвращает нежелательное поведение вращения.
@rafa_pe Я отредактировал ответ, чтобы объяснить, почему ваш обходной путь работает.
Наконец, я поставил 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---
),
)
],
),
);
}
Хороший улов, молодец.
В этом плагине IgnorePointer, похоже, не работает, но это полезная информация для будущих проблем.