Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions example/lib/presentation/resources/app_assets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ class AppAssets {
return 'assets/icons/ic_radar_chart.svg';
case ChartType.candlestick:
return 'assets/icons/ic_candle_chart.svg';
case ChartType.stackedPie:
// TODO: Add new icon
return 'assets/icons/ic_pie_chart.svg';
}
}

Expand Down
6 changes: 6 additions & 0 deletions example/lib/presentation/samples/chart_sample.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,9 @@ class CandlestickChartSample extends ChartSample {
@override
ChartType get type => ChartType.candlestick;
}

class StackedPieChartSample extends ChartSample {
StackedPieChartSample(super.number, super.builder);
@override
ChartType get type => ChartType.stackedPie;
}
4 changes: 4 additions & 0 deletions example/lib/presentation/samples/chart_samples.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:fl_chart_app/presentation/samples/candlestick/candlestick_chart_sample1.dart';
import 'package:fl_chart_app/presentation/samples/stacked_pie/stacked_pie_chart_sample1.dart';
import 'package:fl_chart_app/util/app_helper.dart';

import 'bar/bar_chart_sample1.dart';
Expand Down Expand Up @@ -71,6 +72,9 @@ class ChartSamples {
],
ChartType.candlestick: [
CandlestickChartSample(1, (context) => const CandlestickChartSample1()),
],
ChartType.stackedPie: [
StackedPieChartSample(1, (context) => const StackedPieChartSample1()),
]
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:fl_chart_app/presentation/samples/stacked_pie/stacked_pie_demo.dart';
import 'package:flutter/material.dart';

class StackedPieChartSample1 extends StatefulWidget {
const StackedPieChartSample1({super.key});

@override
State<StackedPieChartSample1> createState() => _StackedPieChartSample1State();
}

class _StackedPieChartSample1State extends State<StackedPieChartSample1> {
@override
Widget build(BuildContext context) {
return const AspectRatio(
aspectRatio: 1.0,
child: Column(
children: <Widget>[
SizedBox(height: 28),
Expanded(
child: StackedPieDemo(),
),
SizedBox(height: 28),
],
),
);
}
}
81 changes: 81 additions & 0 deletions example/lib/presentation/samples/stacked_pie/stacked_pie_demo.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';

class StackedPieDemo extends StatefulWidget {
const StackedPieDemo({super.key});

@override
State<StackedPieDemo> createState() => _StackedPieDemoState();
}

class _StackedPieDemoState extends State<StackedPieDemo> {
int _touchedIndex = -1;
int hacky = 0;

Color _getSegmentColor(int index, Color color) =>
_touchedIndex == -1 || _touchedIndex == index
? color
: color.withValues(alpha: 0.5);

StackedPieChartSectionData createSectionData(
int index,
double weight,
double a,
double b, {
double radius = 100,
}) =>
StackedPieChartSectionData(
weight: weight,
segments: [
StackedPieChartSegmentData(
value: a,
color: _getSegmentColor(index, Colors.lightBlue),
),
StackedPieChartSegmentData(
value: b,
color: _getSegmentColor(index, Colors.redAccent),
),
],
radius: radius,
);

@override
Widget build(BuildContext context) {
return StackedPieChart(
StackedPieChartData(
pieTouchData: StackedPieTouchData(
enabled: true,
touchCallback: (event, response) {
setState(() {
if (!event.isInterestedForInteractions ||
event is! FlTapDownEvent) {
return;
}

final userSelectedIndex =
response?.touchedSection?.touchedSectionIndex ?? -1;

if (_touchedIndex == userSelectedIndex) {
_touchedIndex = -1;
return;
} else {
_touchedIndex = userSelectedIndex;
}
});
},
),
sections: [
createSectionData(1, 60, 90, 10),
createSectionData(2, 60, 70, 30),
createSectionData(3, 60, 100, 0),
createSectionData(4, 30, 90, 10),
createSectionData(5, 30, 60, 40),
createSectionData(6, 30, 100, 0),
createSectionData(7, 30, 10, 90),
createSectionData(8, 30, 60, 40),
createSectionData(9, 30, 0, 100),
],
),
);
}
}
3 changes: 2 additions & 1 deletion example/lib/util/app_helper.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:fl_chart_app/presentation/resources/app_resources.dart';
import 'package:fl_chart_app/urls.dart';

enum ChartType { line, bar, pie, scatter, radar, candlestick }
enum ChartType { line, bar, pie, scatter, radar, candlestick, stackedPie }

extension ChartTypeExtension on ChartType {
String get displayName => '$simpleName Chart';
Expand All @@ -13,6 +13,7 @@ extension ChartTypeExtension on ChartType {
ChartType.scatter => 'Scatter',
ChartType.radar => 'Radar',
ChartType.candlestick => 'Candlestick',
ChartType.stackedPie => 'Stacked Pie',
};

String get documentationUrl => Urls.getChartDocumentationUrl(this);
Expand Down
2 changes: 2 additions & 0 deletions lib/fl_chart.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ export 'src/chart/radar_chart/radar_chart.dart';
export 'src/chart/radar_chart/radar_chart_data.dart';
export 'src/chart/scatter_chart/scatter_chart.dart';
export 'src/chart/scatter_chart/scatter_chart_data.dart';
export 'src/chart/stacked_pie_chart/stacked_pie_chart.dart';
export 'src/chart/stacked_pie_chart/stacked_pie_chart_data.dart';
72 changes: 72 additions & 0 deletions lib/src/chart/stacked_pie_chart/stacked_pie_chart.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import 'package:fl_chart/src/chart/stacked_pie_chart/stacked_pie_chart_data.dart';
import 'package:fl_chart/src/chart/stacked_pie_chart/stacked_pie_chart_renderer.dart';
import 'package:flutter/material.dart';

/// Renders a stacked pie chart as a widget, using provided [StackedPieChartData].
class StackedPieChart extends ImplicitlyAnimatedWidget {
/// [data] defines the look of [StackedPieChart].
/// When you make any change in the [StackedPieChartData], it updates
/// new values with animation, and duration is [duration].
/// also you can change the [curve]
/// which default is [Curves.linear].
const StackedPieChart(
this.data, {
super.key,
super.duration = const Duration(milliseconds: 150),
super.curve = Curves.linear,
});

/// Default duration to reuse externally.
static const defaultDuration = Duration(milliseconds: 150);

/// Determines how the [StackedPieChart] should be look like.
final StackedPieChartData data;

/// Creates a [_StackedPieChartState]
@override
_StackedPieChartState createState() => _StackedPieChartState();
}

class _StackedPieChartState extends AnimatedWidgetBaseState<StackedPieChart> {
StackedPieChartDataTween? _stackedPieChartDataTween;

@override
void initState() {
/// Make sure that [_widgetsPositionHandler] is updated.
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
if (mounted) {
setState(() {});
}
});

super.initState();
}

@override
Widget build(BuildContext context) {
final showingData = _getData();

return StackedPieChartLeaf(
data: _stackedPieChartDataTween!.evaluate(animation),
targetData: showingData,
);
}

/// if builtIn touches are enabled, we should recreate our [pieChartData]
/// to handle built in touches
StackedPieChartData _getData() {
return widget.data;
}

@override
void forEachTween(TweenVisitor<dynamic> visitor) {
_stackedPieChartDataTween = visitor(
_stackedPieChartDataTween,
widget.data,
(dynamic value) => StackedPieChartDataTween(
begin: value as StackedPieChartData, end: widget.data),
) as StackedPieChartDataTween?;
}
}

// TODO: implement BadgeWidgetsDelegate?
Loading
Loading