Compare commits

..

No commits in common. "d601842da09d9ebf339bd5c1eeb12f48ed57b0b3" and "cc0beae94d03b380caf4c1751ced8516a0fdf426" have entirely different histories.

17 changed files with 84 additions and 94 deletions

3
.fvmrc
View File

@ -1,3 +0,0 @@
{
"flutter": "2.8.0"
}

3
.gitignore vendored
View File

@ -14,6 +14,3 @@ ios/Flutter/Generated.xcconfig
ios/Runner/GeneratedPluginRegistrant.*
.history/
# FVM Version Cache
.fvm/

View File

@ -1,8 +1,4 @@
## [0.1.2] - 2021-03-08
* Readme update
## [0.1.1-2] - 2021-03-08
* small improvement
## [0.1.1-0] - 2021-03-08
## [0.1.1] - 2021-03-08
* removed deprecated call on `AnimatedCircularChartState`
## [0.1.0] - 2018-08-30

View File

@ -3,10 +3,10 @@
# Flutter Circular Chart
This library is a fork of the original [flutter_circular_chart](https://pub.dartlang.org/packages/flutter_circular_chart)
This provides fix and will keep updating based on user PR
This provides fix and will keep updating based on user PR, including help the migration to null-safety.
A library for creating animated circular chart widgets with Flutter, inspired by [Zero to One with Flutter](https://medium.com/dartlang/zero-to-one-with-flutter-43b13fd7b354).
## Overview
The original package source can be found here: [flutter_circular_chart](https://pub.dartlang.org/packages/flutter_circular_chart)
This package is abbandoned and no support is being planned. Fork, and publish as you wish with the referenc to the original. PRs will be refused.
The original package provides the context
[flutter_circular_chart](https://pub.dartlang.org/packages/flutter_circular_chart)

View File

@ -57,7 +57,7 @@ class _AnimatedPieChartExampleState extends State<AnimatedPieChartExample> {
setState(() {
sampleIndex++;
List<CircularStackEntry> data = _quarterlyProfitPieData[sampleIndex % 3];
_chartKey.currentState!.updateData(data);
_chartKey.currentState.updateData(data);
});
}

View File

@ -17,13 +17,13 @@ class _AnimatedRadialChartExampleState extends State<AnimatedRadialChartExample>
final _chartSize = const Size(200.0, 200.0);
double value = 50.0;
Color? labelColor = Colors.blue[200];
Color labelColor = Colors.blue[200];
void _increment() {
setState(() {
value += 10;
List<CircularStackEntry> data = _generateChartData(value);
_chartKey.currentState!.updateData(data);
_chartKey.currentState.updateData(data);
});
}
@ -31,12 +31,12 @@ class _AnimatedRadialChartExampleState extends State<AnimatedRadialChartExample>
setState(() {
value -= 10;
List<CircularStackEntry> data = _generateChartData(value);
_chartKey.currentState!.updateData(data);
_chartKey.currentState.updateData(data);
});
}
List<CircularStackEntry> _generateChartData(double value) {
Color? dialColor = Colors.blue[200];
Color dialColor = Colors.blue[200];
if (value < 0) {
dialColor = Colors.red[200];
} else if (value < 50) {
@ -78,7 +78,7 @@ class _AnimatedRadialChartExampleState extends State<AnimatedRadialChartExample>
@override
Widget build(BuildContext context) {
TextStyle _labelStyle =
Theme.of(context).textTheme.headline6!.merge(TextStyle(color: labelColor));
Theme.of(context).textTheme.headline6.merge(TextStyle(color: labelColor));
return Scaffold(
appBar: AppBar(

View File

@ -19,7 +19,7 @@ class _RandomizedRadialChartExampleState extends State<RandomizedRadialChartExam
final GlobalKey<AnimatedCircularChartState> _chartKey = GlobalKey<AnimatedCircularChartState>();
final _chartSize = const Size(300.0, 300.0);
final Math.Random random = Math.Random();
List<CircularStackEntry>? data;
List<CircularStackEntry> data;
@override
void initState() {
@ -32,7 +32,7 @@ class _RandomizedRadialChartExampleState extends State<RandomizedRadialChartExam
void _randomize() {
setState(() {
data = _generateRandomData();
_chartKey.currentState!.updateData(data!);
_chartKey.currentState.updateData(data);
});
}
@ -41,7 +41,7 @@ class _RandomizedRadialChartExampleState extends State<RandomizedRadialChartExam
List<CircularStackEntry> data = List.generate(stackCount, (i) {
int segCount = random.nextInt(10);
List<CircularSegmentEntry> segments = List.generate(segCount, (j) {
Color? randomColor = ColorPalette.primary.random(random);
Color randomColor = ColorPalette.primary.random(random);
return CircularSegmentEntry(random.nextDouble(), randomColor);
});
return CircularStackEntry(segments);

View File

@ -3,7 +3,7 @@ import 'dart:math';
import 'package:flutter/material.dart';
class ColorPalette {
static final ColorPalette primary = ColorPalette(<Color?>[
static final ColorPalette primary = ColorPalette(<Color>[
Colors.blue[400],
Colors.blue[200],
Colors.red[400],
@ -21,15 +21,15 @@ class ColorPalette {
Colors.black,
]);
ColorPalette(List<Color?> colors) : _colors = colors {
ColorPalette(List<Color> colors) : _colors = colors {
assert(colors.isNotEmpty);
}
final List<Color?> _colors;
final List<Color> _colors;
Color? operator [](int index) => _colors[index % length];
Color operator [](int index) => _colors[index % length];
int get length => _colors.length;
Color? random(Random random) => this[random.nextInt(length)];
Color random(Random random) => this[random.nextInt(length)];
}

View File

@ -25,9 +25,9 @@ enum SegmentEdgeStyle {
class AnimatedCircularChart extends StatefulWidget {
AnimatedCircularChart({
Key? key,
required this.size,
required this.initialChartData,
Key key,
@required this.size,
@required this.initialChartData,
this.chartType = CircularChartType.Radial,
this.duration = _kDuration,
this.percentageValues = false,
@ -51,7 +51,7 @@ class AnimatedCircularChart extends StatefulWidget {
/// will be grouped together as concentric circles.
///
/// If [chartType] is [CircularChartType.Pie] then length cannot be > 1.
final List<CircularStackEntry>? initialChartData;
final List<CircularStackEntry> initialChartData;
/// The type of chart to be rendered.
/// Use [CircularChartType.Pie] for a circle divided into slices for each entry.
@ -76,7 +76,7 @@ class AnimatedCircularChart extends StatefulWidget {
/// be automatically calculated to accommodate all the data.
///
/// Has no effect in [CircularChartType.Pie] charts.
final double? holeRadius;
final double holeRadius;
/// The chart gets drawn and animates clockwise from [startAngle], defaulting to the
/// top/center point or -90.0. In terms of a clock face these would be:
@ -92,13 +92,13 @@ class AnimatedCircularChart extends StatefulWidget {
/// in the center of the chart's hole.
///
/// See also [labelStyle] which is used to render the label.
final String? holeLabel;
final String holeLabel;
/// The style used when rendering the [holeLabel].
///
/// Defaults to the active [ThemeData]'s
/// [ThemeData.textTheme.body2] text style.
final TextStyle? labelStyle;
final TextStyle labelStyle;
/// The type of segment edges to be drawn.
///
@ -113,11 +113,11 @@ class AnimatedCircularChart extends StatefulWidget {
/// ```dart
/// AnimatedCircularChartState animatedCircularChart = AnimatedCircularChart.of(context);
/// ```
static AnimatedCircularChartState? of(BuildContext context, {bool nullOk: false}) {
static AnimatedCircularChartState of(BuildContext context, {bool nullOk: false}) {
assert(context != null);
assert(nullOk != null);
final AnimatedCircularChartState? result =
final AnimatedCircularChartState result =
context.findAncestorStateOfType<AnimatedCircularChartState>();
if (nullOk || result != null) return result;
@ -151,10 +151,10 @@ class AnimatedCircularChart extends StatefulWidget {
/// ```
class AnimatedCircularChartState extends State<AnimatedCircularChart>
with TickerProviderStateMixin {
late CircularChartTween _tween;
late AnimationController _animation;
final Map<String?, int> _stackRanks = <String?, int>{};
final Map<String?, int> _entryRanks = <String?, int>{};
CircularChartTween _tween;
AnimationController _animation;
final Map<String, int> _stackRanks = <String, int>{};
final Map<String, int> _entryRanks = <String, int>{};
final TextPainter _labelPainter = TextPainter();
@override
@ -165,13 +165,13 @@ class AnimatedCircularChartState extends State<AnimatedCircularChart>
vsync: this,
);
_assignRanks(widget.initialChartData!);
_assignRanks(widget.initialChartData);
_tween = CircularChartTween(
CircularChart.empty(chartType: widget.chartType),
CircularChart.fromData(
size: widget.size,
data: widget.initialChartData!,
data: widget.initialChartData,
chartType: widget.chartType,
stackRanks: _stackRanks,
entryRanks: _entryRanks,
@ -215,7 +215,7 @@ class AnimatedCircularChartState extends State<AnimatedCircularChart>
void _updateLabelPainter() {
if (widget.holeLabel != null) {
TextStyle? _labelStyle = widget.labelStyle ?? Theme.of(context).textTheme.bodyText1;
TextStyle _labelStyle = widget.labelStyle ?? Theme.of(context).textTheme.bodyText1;
_labelPainter
..text = TextSpan(style: _labelStyle, text: widget.holeLabel)
..textDirection = Directionality.of(context)

View File

@ -17,22 +17,22 @@ class CircularChart {
final List<CircularChartStack> stacks;
final CircularChartType chartType;
final SegmentEdgeStyle? edgeStyle;
final SegmentEdgeStyle edgeStyle;
factory CircularChart.empty({required CircularChartType chartType}) {
factory CircularChart.empty({@required CircularChartType chartType}) {
return CircularChart(<CircularChartStack>[], chartType);
}
factory CircularChart.fromData({
required Size size,
required List<CircularStackEntry> data,
required CircularChartType chartType,
required bool percentageValues,
required double startAngle,
Map<String?, int>? stackRanks,
Map<String?, int>? entryRanks,
double? holeRadius,
SegmentEdgeStyle? edgeStyle,
@required Size size,
@required List<CircularStackEntry> data,
@required CircularChartType chartType,
@required bool percentageValues,
@required double startAngle,
Map<String, int> stackRanks,
Map<String, int> entryRanks,
double holeRadius,
SegmentEdgeStyle edgeStyle,
}) {
final double _holeRadius = holeRadius ?? size.width / (2 + data.length);
final double stackDistance = (size.width / 2 - _holeRadius) / (2 + data.length);
@ -42,7 +42,7 @@ class CircularChart {
List<CircularChartStack> stacks = List<CircularChartStack>.generate(
data.length,
(i) => CircularChartStack.fromData(
stackRanks![data[i].rankKey] ?? i,
stackRanks[data[i].rankKey] ?? i,
data[i].entries,
entryRanks,
percentageValues,
@ -66,7 +66,7 @@ class CircularChartTween extends Tween<CircularChart> {
@override
CircularChart lerp(double t) => CircularChart(
_stacksTween.lerp(t),
begin!.chartType,
edgeStyle: end!.edgeStyle,
begin.chartType,
edgeStyle: end.edgeStyle,
);
}

View File

@ -19,11 +19,11 @@ class CircularSegmentEntry {
final double value;
/// The color drawn in the stack for this segment.
final Color? color;
final Color color;
/// An optional String key, used when animating charts to preserve semantics when
/// transitioning between data points.
final String? rankKey;
final String rankKey;
String toString() {
return '$rankKey: $value $color';
@ -45,5 +45,5 @@ class CircularStackEntry {
/// An optional String key, used when animating charts to preserve semantics when
/// transitioning between data points.
final String? rankKey;
final String rankKey;
}

View File

@ -9,7 +9,7 @@ class AnimatedCircularChartPainter extends CustomPainter {
AnimatedCircularChartPainter(this.animation, this.labelPainter) : super(repaint: animation);
final Animation<CircularChart> animation;
final TextPainter? labelPainter;
final TextPainter labelPainter;
@override
void paint(Canvas canvas, Size size) {
@ -39,7 +39,7 @@ class CircularChartPainter extends CustomPainter {
const double _kRadiansPerDegree = Math.pi / 180;
void _paintLabel(Canvas canvas, Size size, TextPainter? labelPainter) {
void _paintLabel(Canvas canvas, Size size, TextPainter labelPainter) {
if (labelPainter != null) {
labelPainter.paint(
canvas,
@ -59,16 +59,16 @@ void _paintChart(Canvas canvas, Size size, CircularChart chart) {
for (final CircularChartStack stack in chart.stacks) {
for (final segment in stack.segments) {
segmentPaint.color = segment.color!;
segmentPaint.strokeWidth = stack.width!;
segmentPaint.color = segment.color;
segmentPaint.strokeWidth = stack.width;
canvas.drawArc(
Rect.fromCircle(
center: Offset(size.width / 2, size.height / 2),
radius: stack.radius!,
radius: stack.radius,
),
stack.startAngle! * _kRadiansPerDegree,
segment.sweepAngle! * _kRadiansPerDegree,
stack.startAngle * _kRadiansPerDegree,
segment.sweepAngle * _kRadiansPerDegree,
chart.chartType == CircularChartType.Pie,
segmentPaint,
);

View File

@ -7,8 +7,8 @@ class CircularChartSegment extends MergeTweenable<CircularChartSegment> {
CircularChartSegment(this.rank, this.sweepAngle, this.color);
final int rank;
final double? sweepAngle;
final Color? color;
final double sweepAngle;
final Color color;
@override
CircularChartSegment get empty => CircularChartSegment(rank, 0.0, color);
@ -38,5 +38,5 @@ class CircularChartSegmentTween extends Tween<CircularChartSegment> {
}
@override
CircularChartSegment lerp(double t) => CircularChartSegment.lerp(begin!, end!, t);
CircularChartSegment lerp(double t) => CircularChartSegment.lerp(begin, end, t);
}

View File

@ -17,15 +17,15 @@ class CircularChartStack implements MergeTweenable<CircularChartStack> {
);
final int rank;
final double? radius;
final double? width;
final double? startAngle;
final double radius;
final double width;
final double startAngle;
final List<CircularChartSegment> segments;
factory CircularChartStack.fromData(
int stackRank,
List<CircularSegmentEntry> entries,
Map<String?, int>? entryRanks,
Map<String, int> entryRanks,
bool percentageValues,
double startRadius,
double stackWidth,
@ -42,7 +42,7 @@ class CircularChartStack implements MergeTweenable<CircularChartStack> {
List<CircularChartSegment> segments = List<CircularChartSegment>.generate(entries.length, (i) {
double sweepAngle = (entries[i].value / valueSum * _kMaxAngle) + previousSweepAngle;
previousSweepAngle = sweepAngle;
int rank = entryRanks![entries[i].rankKey] ?? i;
int rank = entryRanks[entries[i].rankKey] ?? i;
return CircularChartSegment(rank, sweepAngle, entries[i].color);
});
@ -78,10 +78,10 @@ class CircularChartStackTween extends Tween<CircularChartStack> {
@override
CircularChartStack lerp(double t) => CircularChartStack(
begin!.rank,
lerpDouble(begin!.radius, end!.radius, t),
lerpDouble(begin!.width, end!.width, t),
lerpDouble(begin!.startAngle, end!.startAngle, t),
begin.rank,
lerpDouble(begin.radius, end.radius, t),
lerpDouble(begin.width, end.width, t),
lerpDouble(begin.startAngle, end.startAngle, t),
_circularSegmentsTween.lerp(t),
);
}

View File

@ -7,7 +7,7 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.2"
version: "2.5.0"
boolean_selector:
dependency: transitive
description:
@ -21,14 +21,14 @@ packages:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
version: "1.2.0"
clock:
dependency: transitive
description:
@ -66,14 +66,14 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.11"
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
version: "1.3.0"
path:
dependency: transitive
description:
@ -92,7 +92,7 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
version: "1.8.0"
stack_trace:
dependency: transitive
description:
@ -127,7 +127,7 @@ packages:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.3"
version: "0.2.19"
typed_data:
dependency: transitive
description:
@ -141,6 +141,6 @@ packages:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
sdks:
dart: ">=2.14.0 <3.0.0"
dart: ">=2.12.0-0.0 <3.0.0"

View File

@ -1,7 +1,7 @@
name: flutter_circular_chart_two
description: Animated radial and pie charts for Flutter. Forked from https://github.com/xqwzts/flutter_circular_chart
version: "0.1.2"
homepage: https://github.com/GusRodrigues86/flutter_circular_chart
version: 0.1.1-0
homepage: https://github.com/GusRodrigues86/circular_charts
dependencies:
flutter:
@ -12,4 +12,4 @@ dev_dependencies:
sdk: flutter
environment:
sdk: '>=2.12.0 <3.0.0'
sdk: ">=2.0.0 <3.0.0"