Compare commits
10 Commits
cc0beae94d
...
d601842da0
Author | SHA1 | Date | |
---|---|---|---|
d601842da0 | |||
e7317c8a07 | |||
|
9f1a8d0128 | ||
|
3193424f8f | ||
|
573844b0b0 | ||
|
69042fd27d | ||
|
6281d24c64 | ||
|
11cba09e30 | ||
|
0d7db1c890 | ||
|
c1ec946371 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -14,3 +14,6 @@ ios/Flutter/Generated.xcconfig
|
||||
ios/Runner/GeneratedPluginRegistrant.*
|
||||
|
||||
.history/
|
||||
|
||||
# FVM Version Cache
|
||||
.fvm/
|
@ -1,4 +1,8 @@
|
||||
## [0.1.1] - 2021-03-08
|
||||
## [0.1.2] - 2021-03-08
|
||||
* Readme update
|
||||
## [0.1.1-2] - 2021-03-08
|
||||
* small improvement
|
||||
## [0.1.1-0] - 2021-03-08
|
||||
* removed deprecated call on `AnimatedCircularChartState`
|
||||
## [0.1.0] - 2018-08-30
|
||||
|
||||
|
@ -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
|
||||
|
||||
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).
|
||||
This provides fix and will keep updating based on user PR, including help the migration to null-safety.
|
||||
|
||||
## Overview
|
||||
The original package provides the context
|
||||
[flutter_circular_chart](https://pub.dartlang.org/packages/flutter_circular_chart)
|
||||
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.
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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);
|
||||
|
@ -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)];
|
||||
}
|
||||
|
@ -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 {
|
||||
CircularChartTween _tween;
|
||||
AnimationController _animation;
|
||||
final Map<String, int> _stackRanks = <String, int>{};
|
||||
final Map<String, int> _entryRanks = <String, int>{};
|
||||
late CircularChartTween _tween;
|
||||
late 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)
|
||||
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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),
|
||||
);
|
||||
}
|
||||
|
18
pubspec.lock
18
pubspec.lock
@ -7,7 +7,7 @@ packages:
|
||||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.8.2"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -21,14 +21,14 @@ packages:
|
||||
name: characters
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "1.2.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.3.1"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -66,14 +66,14 @@ packages:
|
||||
name: matcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.12.10"
|
||||
version: "0.12.11"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
version: "1.7.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -92,7 +92,7 @@ packages:
|
||||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
version: "1.8.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -127,7 +127,7 @@ packages:
|
||||
name: test_api
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.19"
|
||||
version: "0.4.3"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -141,6 +141,6 @@ packages:
|
||||
name: vector_math
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.1.1"
|
||||
sdks:
|
||||
dart: ">=2.12.0-0.0 <3.0.0"
|
||||
dart: ">=2.14.0 <3.0.0"
|
||||
|
@ -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.1-0
|
||||
homepage: https://github.com/GusRodrigues86/circular_charts
|
||||
version: "0.1.2"
|
||||
homepage: https://github.com/GusRodrigues86/flutter_circular_chart
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
@ -12,4 +12,4 @@ dev_dependencies:
|
||||
sdk: flutter
|
||||
|
||||
environment:
|
||||
sdk: ">=2.0.0 <3.0.0"
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
|
Loading…
Reference in New Issue
Block a user