Skip to content

Commit 6a9aec1

Browse files
committed
[ADD] StackedPieChart
Signed-off-by: Jonas Klock <jonas.klock@exxeta.com>
1 parent 0436f7f commit 6a9aec1

File tree

13 files changed

+1329
-1
lines changed

13 files changed

+1329
-1
lines changed

example/lib/presentation/resources/app_assets.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class AppAssets {
1515
return 'assets/icons/ic_radar_chart.svg';
1616
case ChartType.candlestick:
1717
return 'assets/icons/ic_candle_chart.svg';
18+
case ChartType.stackedPie:
19+
// TODO: Add new icon
20+
return 'assets/icons/ic_pie_chart.svg';
1821
}
1922
}
2023

example/lib/presentation/samples/chart_sample.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,9 @@ class CandlestickChartSample extends ChartSample {
4646
@override
4747
ChartType get type => ChartType.candlestick;
4848
}
49+
50+
class StackedPieChartSample extends ChartSample {
51+
StackedPieChartSample(super.number, super.builder);
52+
@override
53+
ChartType get type => ChartType.pie;
54+
}

example/lib/presentation/samples/chart_samples.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:fl_chart_app/presentation/samples/candlestick/candlestick_chart_sample1.dart';
2+
import 'package:fl_chart_app/presentation/samples/stacked_pie/stacked_pie_chart_sample1.dart';
23
import 'package:fl_chart_app/util/app_helper.dart';
34

45
import 'bar/bar_chart_sample1.dart';
@@ -71,6 +72,9 @@ class ChartSamples {
7172
],
7273
ChartType.candlestick: [
7374
CandlestickChartSample(1, (context) => const CandlestickChartSample1()),
75+
],
76+
ChartType.stackedPie: [
77+
StackedPieChartSample(1, (context) => const StackedPieChartSample1()),
7478
]
7579
};
7680
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:fl_chart_app/presentation/samples/stacked_pie/stacked_pie_demo.dart';
2+
import 'package:flutter/material.dart';
3+
4+
class StackedPieChartSample1 extends StatefulWidget {
5+
const StackedPieChartSample1({super.key});
6+
7+
@override
8+
State<StackedPieChartSample1> createState() => _StackedPieChartSample1State();
9+
}
10+
11+
class _StackedPieChartSample1State extends State<StackedPieChartSample1> {
12+
@override
13+
Widget build(BuildContext context) {
14+
return const AspectRatio(
15+
aspectRatio: 1.3,
16+
child: Column(
17+
children: <Widget>[
18+
SizedBox(height: 28),
19+
Expanded(
20+
child: AspectRatio(
21+
aspectRatio: 1,
22+
child: StackedPieDemo(),
23+
),
24+
),
25+
],
26+
),
27+
);
28+
}
29+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'package:fl_chart/fl_chart.dart';
2+
import 'package:flutter/material.dart';
3+
4+
class StackedPieDemo extends StatelessWidget {
5+
const StackedPieDemo({super.key});
6+
7+
StackedPieChartSectionData createSectionData(
8+
double weight,
9+
double a,
10+
double b, {
11+
double radius = 100,
12+
}) =>
13+
StackedPieChartSectionData(
14+
weight: weight,
15+
segments: [
16+
StackedPieChartSegmentData(
17+
value: a,
18+
color: Colors.lightBlue,
19+
),
20+
StackedPieChartSegmentData(
21+
value: b,
22+
color: Colors.redAccent,
23+
),
24+
],
25+
radius: radius,
26+
);
27+
28+
@override
29+
Widget build(BuildContext context) {
30+
return StackedPieChart(
31+
StackedPieChartData(
32+
sections: [
33+
createSectionData(60, 90, 10),
34+
createSectionData(60, 70, 30),
35+
createSectionData(60, 100, 0),
36+
createSectionData(30, 90, 10),
37+
createSectionData(30, 60, 40),
38+
createSectionData(30, 100, 0),
39+
createSectionData(30, 10, 90),
40+
createSectionData(30, 60, 40),
41+
createSectionData(30, 0, 100),
42+
],
43+
),
44+
);
45+
}
46+
}

example/lib/util/app_helper.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:fl_chart_app/presentation/resources/app_resources.dart';
22
import 'package:fl_chart_app/urls.dart';
33

4-
enum ChartType { line, bar, pie, scatter, radar, candlestick }
4+
enum ChartType { line, bar, pie, scatter, radar, candlestick, stackedPie }
55

66
extension ChartTypeExtension on ChartType {
77
String get displayName => '$simpleName Chart';
@@ -13,6 +13,7 @@ extension ChartTypeExtension on ChartType {
1313
ChartType.scatter => 'Scatter',
1414
ChartType.radar => 'Radar',
1515
ChartType.candlestick => 'Candlestick',
16+
ChartType.stackedPie => 'Stacked Pie',
1617
};
1718

1819
String get documentationUrl => Urls.getChartDocumentationUrl(this);

lib/fl_chart.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ export 'src/chart/radar_chart/radar_chart.dart';
1616
export 'src/chart/radar_chart/radar_chart_data.dart';
1717
export 'src/chart/scatter_chart/scatter_chart.dart';
1818
export 'src/chart/scatter_chart/scatter_chart_data.dart';
19+
export 'src/chart/stacked_pie_chart/stacked_pie_chart.dart';
20+
export 'src/chart/stacked_pie_chart/stacked_pie_chart_data.dart';
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'package:fl_chart/src/chart/stacked_pie_chart/stacked_pie_chart_data.dart';
2+
import 'package:fl_chart/src/chart/stacked_pie_chart/stacked_pie_chart_renderer.dart';
3+
import 'package:flutter/material.dart';
4+
5+
/// Renders a stacked pie chart as a widget, using provided [StackedPieChartData].
6+
class StackedPieChart extends ImplicitlyAnimatedWidget {
7+
/// [data] defines the look of [StackedPieChart].
8+
/// When you make any change in the [StackedPieChartData], it updates
9+
/// new values with animation, and duration is [duration].
10+
/// also you can change the [curve]
11+
/// which default is [Curves.linear].
12+
const StackedPieChart(
13+
this.data, {
14+
super.key,
15+
super.duration = const Duration(milliseconds: 150),
16+
super.curve = Curves.linear,
17+
});
18+
19+
/// Default duration to reuse externally.
20+
static const defaultDuration = Duration(milliseconds: 150);
21+
22+
/// Determines how the [StackedPieChart] should be look like.
23+
final StackedPieChartData data;
24+
25+
/// Creates a [_StackedPieChartState]
26+
@override
27+
_StackedPieChartState createState() => _StackedPieChartState();
28+
}
29+
30+
class _StackedPieChartState extends AnimatedWidgetBaseState<StackedPieChart> {
31+
StackedPieChartDataTween? _stackedPieChartDataTween;
32+
33+
@override
34+
void initState() {
35+
/// Make sure that [_widgetsPositionHandler] is updated.
36+
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
37+
if (mounted) {
38+
setState(() {});
39+
}
40+
});
41+
42+
super.initState();
43+
}
44+
45+
@override
46+
Widget build(BuildContext context) {
47+
final showingData = _getData();
48+
49+
return StackedPieChartLeaf(
50+
data: _stackedPieChartDataTween!.evaluate(animation),
51+
targetData: showingData,
52+
);
53+
}
54+
55+
/// if builtIn touches are enabled, we should recreate our [pieChartData]
56+
/// to handle built in touches
57+
StackedPieChartData _getData() {
58+
return widget.data;
59+
}
60+
61+
@override
62+
void forEachTween(TweenVisitor<dynamic> visitor) {
63+
_stackedPieChartDataTween = visitor(
64+
_stackedPieChartDataTween,
65+
widget.data,
66+
(dynamic value) => StackedPieChartDataTween(
67+
begin: value as StackedPieChartData, end: widget.data),
68+
) as StackedPieChartDataTween?;
69+
}
70+
}
71+
72+
// TODO: implement BadgeWidgetsDelegate?

0 commit comments

Comments
 (0)