Skip to content

Commit

Permalink
feat: add sweep gradient wip
Browse files Browse the repository at this point in the history
  • Loading branch information
frybitsinc committed Sep 23, 2024
1 parent b1e3440 commit 1336e36
Show file tree
Hide file tree
Showing 5 changed files with 363 additions and 5 deletions.
4 changes: 2 additions & 2 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ EXTERNAL SOURCES:

SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe

PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011
Expand Down
2 changes: 1 addition & 1 deletion example/ios/Runner/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import UIKit
import Flutter

@UIApplicationMain
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
Expand Down
4 changes: 3 additions & 1 deletion example/lib/presentation/samples/chart_samples.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:fl_chart_app/presentation/samples/radar/radar_chart_sample2.dart';
import 'package:fl_chart_app/util/app_helper.dart';

import 'bar/bar_chart_sample1.dart';
Expand Down Expand Up @@ -62,7 +63,8 @@ class ChartSamples {
ScatterChartSample(2, (context) => const ScatterChartSample2()),
],
ChartType.radar: [
RadarChartSample(1, (context) => RadarChartSample1()),
// RadarChartSample(1, (context) => RadarChartSample1()),
RadarChartSample(2, (context) => RadarChartSample2()),
],
};
}
313 changes: 313 additions & 0 deletions example/lib/presentation/samples/radar/radar_chart_sample2.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
import 'package:fl_chart_app/presentation/resources/app_resources.dart';
import 'package:fl_chart_app/util/extensions/color_extensions.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';

class RadarChartSample2 extends StatefulWidget {
RadarChartSample2({super.key});

final gridColor = AppColors.contentColorPurple.lighten(80);
final titleColor = AppColors.contentColorPurple.lighten(80);
final fashionColor = AppColors.contentColorRed;
final artColor = AppColors.contentColorCyan;
final boxingColor = AppColors.contentColorGreen;
final entertainmentColor = AppColors.contentColorWhite;
final offRoadColor = AppColors.contentColorYellow;

@override
State<RadarChartSample2> createState() => _RadarChartSample2State();
}

class _RadarChartSample2State extends State<RadarChartSample2> {
int selectedDataSetIndex = -1;
double angleValue = 0;
bool relativeAngleMode = true;

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'Title configuration',
style: TextStyle(
color: AppColors.mainTextColor2,
),
),
Row(
children: [
const Text(
'Angle',
style: TextStyle(
color: AppColors.mainTextColor2,
),
),
Slider(
value: angleValue,
max: 360,
onChanged: (double value) => setState(() => angleValue = value),
),
],
),
Row(
children: [
Checkbox(
value: relativeAngleMode,
onChanged: (v) => setState(() => relativeAngleMode = v!),
),
const Text('Relative'),
],
),
GestureDetector(
onTap: () {
setState(() {
selectedDataSetIndex = -1;
});
},
child: Text(
'Categories'.toUpperCase(),
style: const TextStyle(
fontSize: 32,
fontWeight: FontWeight.w300,
color: AppColors.mainTextColor1,
),
),
),
const SizedBox(height: 4),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: rawDataSets()
.asMap()
.map((index, value) {
final isSelected = index == selectedDataSetIndex;
return MapEntry(
index,
GestureDetector(
onTap: () {
setState(() {
selectedDataSetIndex = index;
});
},
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
margin: const EdgeInsets.symmetric(vertical: 2),
height: 26,
decoration: BoxDecoration(
color: isSelected
? AppColors.pageBackground
: Colors.transparent,
borderRadius: BorderRadius.circular(46),
),
padding: const EdgeInsets.symmetric(
vertical: 4,
horizontal: 6,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
AnimatedContainer(
duration: const Duration(milliseconds: 400),
curve: Curves.easeInToLinear,
padding: EdgeInsets.all(isSelected ? 8 : 6),
decoration: BoxDecoration(
color: value.color,
shape: BoxShape.circle,
),
),
const SizedBox(width: 8),
AnimatedDefaultTextStyle(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInToLinear,
style: TextStyle(
color:
isSelected ? value.color : widget.gridColor,
),
child: Text(value.title),
),
],
),
),
),
);
})
.values
.toList(),
),
AspectRatio(
aspectRatio: 1.0,
child: RadarChart(
RadarChartData(
radarTouchData: RadarTouchData(
touchCallback: (FlTouchEvent event, response) {
if (!event.isInterestedForInteractions) {
setState(() {
selectedDataSetIndex = -1;
});
return;
}
setState(() {
selectedDataSetIndex =
response?.touchedSpot?.touchedDataSetIndex ?? -1;
});
},
),
dataSets: showingDataSets(),
radarBackgroundColor: Colors.transparent,
borderData: FlBorderData(show: false),
radarBorderData: const BorderSide(color: Colors.transparent),
titlePositionPercentageOffset: 0.1,
titleTextStyle:
TextStyle(color: widget.titleColor, fontSize: 14),
getTitle: (index, angle) {
final usedAngle =
relativeAngleMode ? angle + angleValue : angleValue;
switch (index) {
case 0:
return RadarChartTitle(
text: 'Mobile or Tablet',
children: [
const TextSpan(
text: "\n(or sth else..",
style: TextStyle(
fontSize: 17,
color: Colors.red,
fontWeight: FontWeight.w700),
),
const TextSpan(
text: "or watever)",
style: TextStyle(
fontSize: 17,
color: Colors.green,
fontWeight: FontWeight.w700),
),
],
angle: usedAngle,
);
case 5:
return RadarChartTitle(text: '55555', angle: usedAngle);
case 4:
return RadarChartTitle(text: '4444', angle: usedAngle);
case 3:
return RadarChartTitle(text: '333', angle: usedAngle);
case 2:
return RadarChartTitle(
text: 'Desktop',
angle: usedAngle,
);
case 1:
return RadarChartTitle(text: 'TV', angle: usedAngle);
default:
return const RadarChartTitle(text: '');
}
},
tickCount: 1,
ticksTextStyle:
const TextStyle(color: Colors.transparent, fontSize: 10),
tickBorderData: const BorderSide(color: Colors.transparent),
gridBorderData: BorderSide(color: widget.gridColor, width: 2),
),
swapAnimationDuration: const Duration(milliseconds: 400),
),
),
],
),
);
}

List<RadarDataSet> showingDataSets() {
return rawDataSets().asMap().entries.map((entry) {
final index = entry.key;
final rawDataSet = entry.value;

final isSelected = index == selectedDataSetIndex
? true
: selectedDataSetIndex == -1
? true
: false;

return RadarDataSet(
fillColor: isSelected
? rawDataSet.color.withOpacity(0.2)
: rawDataSet.color.withOpacity(0.01),
borderColor: isSelected
? rawDataSet.color.withOpacity(0.6)
: rawDataSet.color.withOpacity(0.15),
entryRadius: isSelected ? 3 : 2,
dataEntries:
rawDataSet.values.map((e) => RadarEntry(value: e)).toList(),
borderWidth: isSelected ? 1.0 : 0.3,
);
}).toList();
}

List<RawDataSet> rawDataSets() {
return [
RawDataSet(
title: 'Fashion',
color: Colors.grey, //widget.fashionColor,
values: [
300,
50,
250,
250,
250,
250,
],
),
// RawDataSet(
// title: 'Art & Tech',
// color: widget.artColor,
// values: [
// 250,
// 100,
// 200,
// ],
// ),
// RawDataSet(
// title: 'Entertainment',
// color: widget.entertainmentColor,
// values: [
// 200,
// 150,
// 50,
// ],
// ),
// RawDataSet(
// title: 'Off-road Vehicle',
// color: widget.offRoadColor,
// values: [
// 150,
// 200,
// 150,
// ],
// ),
RawDataSet(
title: 'Boxing',
color: widget.boxingColor,
values: [
150,
150,
150,
150,
150,
150,
],
),
];
}
}

class RawDataSet {
RawDataSet({
required this.title,
required this.color,
required this.values,
});

final String title;
final Color color;
final List<double> values;
}
Loading

0 comments on commit 1336e36

Please sign in to comment.