Callbacks in Flutter Circular Charts (SfCircularChart)
24 Nov 202324 minutes to read
Circular chart contains the below listed callbacks
onLegendItemRender
Triggers when the legend item is rendering. Here, you can customize the legend’s text, and shape. The onLegendItemRender
Callback contains the following arguments.
-
text
- specifies the content of the legend. -
pointIndex
- specifies the current point index that is applicable for circular chart type alone. -
seriesIndex
- specifies the current series index. -
legendIconType
- specifies the shape of the legend. -
color
- to get and set the color of the legend icon.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
legend: Legend(isVisible: true),
onLegendItemRender: (LegendRenderArgs args){
args.text = 'Legend Text';
args.legendIconType = LegendIconType.diamond;
}
)
)
);
}
onTooltipRender
Triggers while tooltip is rendering. Here, you can customize the text, header, x and y-positions. The onTooltipRender
Callback contains the following arguments.
-
text
- specifies the content of the tooltip. -
header
- specifies the header content of the tooltip. -
locationX
- specifies the x position of tooltip. -
locationY
- specifies the y position of tooltip. -
seriesIndex
- specifies the current series index. -
dataPoints
- holds the data point collection. -
pointIndex
- specifies the current point index. -
viewportPointIndex
- to get the viewport index value of the tapped data label.
late TooltipBehavior _tooltipBehavior;
@override
void initState(){
_tooltipBehavior = TooltipBehavior(enable: true);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
onTooltipRender: (TooltipArgs args){
args.text = 'Custom Text';
},
tooltipBehavior:_tooltipBehavior,
)
)
);
}
onDataLabelRender
Triggers when data label is rendering. Text and text styles such as color, font size, and font weight can be customized. The onDataLabelRender
Callback contains the following arguments.
-
text
- specifies the content of the data label. -
textStyle
- used to change the text color, size, font family, font style, and font weight. -
pointIndex
- specifies the current point index. -
seriesRenderer
- specifies current series. -
color
- to get and set the color of data label. -
viewportPointIndex
- to get the viewport index value of the tapped data label. -
dataPoints
- to get the data points of the series.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
onDataLabelRender:(DataLabelRenderArgs args){
args.text = 'Data label';
},
series: <CircularSeries>[
PieSeries<ChartData, String>(
dataLabelSettings: DataLabelSettings(
isVisible: true
)
)
]
)
)
);
}
onPointTap
Triggers when tapping on the series point. The onPointTap
callback contains the following arguments.
-
seriesIndex
- specifies the current series index. -
pointIndex
- specifies the current point index. -
dataPoints
- holds the data point collection. -
viewportPointIndex
- specifies the viewport index value of the tapped data point.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
series: <CircularSeries>[
PieSeries<ChartData, String>(
onPointTap: (ChartPointDetails details) {
print(details.pointIndex);
print(details.seriesIndex);
}
)
],
)
)
);
}
See Also
onPointDoubleTap
Triggers when double-tap the series point. The onPointDoubleTap
callback contains the following arguments.
-
seriesIndex
- specifies the current series index. -
pointIndex
- specifies the current point index. -
dataPoints
- holds the data point collection. -
viewportPointIndex
- specifies the viewport index value of the double-tapped data point.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
series: <CircularSeries>[
PieSeries<ChartData, String>(
onPointDoubleTap: (ChartPointDetails details) {
print(details.pointIndex);
print(details.seriesIndex);
}
)
],
)
)
);
}
onPointLongPress
Triggers when long press on the series point. The onPointLongPress
callback contains the following arguments.
-
seriesIndex
- specifies the current series index. -
pointIndex
- specifies the current point index. -
dataPoints
- holds the data point collection. -
viewportPointIndex
- specifies the viewport index value of the long pressed data point.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
series: <CircularSeries>[
PieSeries<ChartData, String>(
onPointLongPress: (ChartPointDetails details) {
print(details.pointIndex);
print(details.seriesIndex);
}
)
],
)
)
);
}
onLegendTapped
Triggers when tapping the legend item. The onLegendTapped
Callback contains the following arguments.
-
seriesIndex
- specifies the current series index. -
pointIndex
- specifies the current point index that is applicable for circular series. -
series
- specifies the current series.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
onLegendTapped: (LegendTapArgs args) {
print(args.seriesIndex);
},
legend: Legend(isVisible: true)
)
)
);
}
onSelectionChanged
Triggers while selection changes. Here you can customize the selectedColor, unselectedColor, selectedBorderColor, selectedBorderWidth, unselectedBorderColor, and unselectedBorderWidth properties. The onSelectionChanged
Callback contains the following arguments.
-
seriesRenderer
- specifies current series. -
seriesIndex
- specifies the current series index. -
pointIndex
- specifies the current point index. -
selectedColor
- specifies color of the selected data points or series. -
unselectedColor
- specifies color of the unselected data points or series. -
selectedBorderColor
- specifies border color of the selected data points or series. -
selectedBorderWidth
- specifies border width of the selected data points or series. -
unselectedBorderColor
- specifies border color of the unselected data points or series. -
unselectedBorderWidth
- specifies border width of the unselected data points or series. -
viewportPointIndex
- to get the overall point index.
late SelectionBehavior _selectionBehavior;
@override
void initState(){
_selectionBehavior = SelectionBehavior(
enable: true);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SfCircularChart(
onSelectionChanged: (SelectionArgs args){
args.selectedColor = Colors.red;
args.unselectedColor = Colors.lightGreen;
},
series: <CircularSeries>[
PieSeries<ChartData, String>(
selectionBehavior: _selectionBehavior
)
]
)
)
);
}
onDataLabelTapped
Triggers when tapping on the data label of the data point in the series. The onDataLabelTapped
Callback contains the following arguments.
-
position
- specifies the position of the tapped data label in logical pixels. -
seriesIndex
- Specifies the series index of the tapped data label -
pointIndex
- Specifies the point index of the tapped data label. -
text
- Specifies the content of the tapped data label. -
dataLabelSettings
- to get the data label customization options specified in that particular series. -
viewportPointIndex
- to get the viewport index value of the tapped data label.
Note: This callback will not be called, when the builder is specified for data label (data label template). For this case, custom widget specified in the
DataLabelSettings.builder
property can be wrapped using theGestureDetector
and this functionality can be achieved in the application level.
@override
Widget build(BuildContext context) {
return Container(
child: SfCircularChart(
onDatalabelTapped: (DataLabelTapArgs args) {
print(args.seriesIndex);
},
series: <CircularSeries<Sample, DateTime>>[
PieSeries<Sample, DateTime>(
dataSource: sample,
xValueMapper: (Sample data, _) => data.x,
yValueMapper: (Sample data, _) => data.y,
dataLabelSettings: DataLabelSettings(
isVisible: true),
)
]
)
);
}
onChartTouchInteractionUp
Triggers when tapped or clicked on the chart area. You can get the tapped region using the position
argument.
@override
Widget build(BuildContext context) {
return Container(
child: SfCircularChart(
onChartTouchInteractionUp: (ChartTouchInteractionArgs args){
print(args.position.dx.toString());
print(args.position.dy.toString());
}
)
);
}
onChartTouchInteractionMove
Triggers when tapped or clicked and moved on the chart area. You can get the tapped region using the position
argument.
@override
Widget build(BuildContext context) {
return Container(
child: SfCircularChart(
onChartTouchInteractionMove: (ChartTouchInteractionArgs args){
print(args.position.dx.toString());
print(args.position.dy.toString());
}
)
);
}
onChartTouchInteractionDown
Triggers when touched or clicked on the chart area. You can get the tapped region using the position
argument.
@override
Widget build(BuildContext context) {
return Container(
child: SfCircularChart(
onChartTouchInteractionDown: (ChartTouchInteractionArgs args){
print(args.position.dx.toString());
print(args.position.dy.toString());
}
)
);
}
onRendererCreated
Triggers when the series renderer is created. This callback can be used to obtain the CircularSeriesController
instance, which is used to access the the public methods in the series.
//Initialize the series controller
CircularSeriesController? circularSeriesController;
late List<ChartData> chartData;
@override
void initState() {
chartData = <ChartData>[
ChartData(1, 24),
ChartData(2, 20),
ChartData(3, 23),
ChartData(4, 57),
ChartData(5, 30),
ChartData(6, 41),
];
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
Container(
child: SfCircularChart(
series: <CircularSeries<ChartData, dynamic>>[
DoughnutSeries<ChartData, dynamic>(
dataSource: chartData,
xValueMapper: (ChartData data, _) => data.x,
yValueMapper: (ChartData data, _) => data.y,
onRendererCreated: (CircularSeriesController controller) {
circularSeriesController = controller;
},
),
],
)
),
Container(
child: ElevatedButton(
onPressed: () {
//Removed a point from data source
chartData.removeAt(0);
//Added a point to the data source
chartData.add(ChartData(3, 23));
//Here accessed the public method of the series.
circularSeriesController!.updateDataSource(
addedDataIndexes: <int>[chartData.length - 1],
removedDataIndexes: <int>[0],
);
},
child: Container(
child: Text('Add a point'),
)
)
)
]
);
}
class ChartData {
ChartData(this.x, this.y);
final num x;
final double? y;
}
onCreateShader
The onCreateShader
provides options to get the outer rect, inner rect, and render type (either series or legend) using ChartShaderDetails
class.
The onCreateShader callback is called once while rendering
the data points and legend. For further reference on this callback, check the Gradient and ImageShader
section.
/// Package import
import 'dart:ui' as ui;
Widget build(BuildContext context) {
final List<ChartData> chartData = <ChartData>[
ChartData('IND', 24),
ChartData('AUS', 20),
ChartData('USA', 27),
ChartData('DEU', 57),
ChartData('ITA', 30),
ChartData('UK', 41),
];
final List<Color> colors = <Color>[
const Color.fromRGBO(75, 135, 185, 1),
const Color.fromRGBO(192, 108, 132, 1),
const Color.fromRGBO(246, 114, 128, 1),
const Color.fromRGBO(248, 177, 149, 1),
const Color.fromRGBO(116, 180, 155, 1)
];
final List<double> stops = <double>[
0.2,
0.4,
0.6,
0.8,
1,
];
return Scaffold(
body: Center(
child: Container(
child: SfCircularChart(
onCreateShader: (ChartShaderDetails chartShaderDetails) {
return ui.Gradient.linear(chartShaderDetails.outerRect.topRight,
chartShaderDetails.outerRect.centerLeft, colors, stops);
},
series: <PieSeries<ChartData, String>>[
PieSeries<ChartData, String>(
dataSource: chartData,
xValueMapper: (ChartData data, _) => data.x,
yValueMapper: (ChartData data, _) => data.y),
]
),
)
)
);
}
class ChartData {
ChartData(this.x, this.y);
final String x;
final double? y;
}