dfd
unknown
dart
2 years ago
8.4 kB
10
Indexable
import 'package:erp/utils/conts/color_manager.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../../../utils/global/size_box.dart';
import '../../../../utils/resources/app_colors.dart';
class CustomBarChartWidget extends StatefulWidget {
List<String> bottomTitleList;
List<String> leftTitleList;
List<String> firstDataList;
List<String> secondDataList;
Color leftBarColor;
Color rightBarColor;
Color avgColor;
CustomBarChartWidget({
this.bottomTitleList = const ['Mn', 'Te', 'Wd', 'Tu', 'Fr', 'St', 'Su'],
this.leftTitleList = const ['1K', '5K', '10K', '15K', '20K', '25K', '30K'],
required this.firstDataList,
required this.secondDataList,
this.leftBarColor = ColorManager.yellowGraph,
this.rightBarColor = ColorManager.redGraph,
this.avgColor = Colors.green,
super.key
});
@override
State<StatefulWidget> createState() => CustomBarChartWidgetState();
}
class CustomBarChartWidgetState extends State<CustomBarChartWidget> {
final double width = 7;
List<BarChartGroupData> rawBarGroups = [];
List<BarChartGroupData> showingBarGroups = [];
int touchedGroupIndex = -1;
@override
void initState() {
super.initState();
print("firs.....${widget.firstDataList}++");
// final barGroup1 = makeGroupData(0, 5, 12);
// final barGroup2 = makeGroupData(1, 16, 12);
// final barGroup3 = makeGroupData(2, 18, 5);
// final barGroup4 = makeGroupData(3, 20, 16);
// final barGroup5 = makeGroupData(4, 17, 6);
// final barGroup6 = makeGroupData(5, 19, 1.5);
// final barGroup7 = makeGroupData(6, 10, 1.5);
//rawBarGroups.clear();
for(int i=0; i<widget.firstDataList.length; i++){
rawBarGroups.add(makeGroupData(i, double.parse(widget.firstDataList[i]), double.parse(widget.secondDataList[i])));
}
// final items = [
// barGroup1,
// barGroup2,
// barGroup3,
// barGroup4,
// barGroup5,
// barGroup6,
// barGroup7,
// ];
//
// rawBarGroups = items;
showingBarGroups = rawBarGroups;
}
@override
Widget build(BuildContext context) {
rawBarGroups.clear();
for(int i=0; i<widget.firstDataList.length; i++){
rawBarGroups.add(makeGroupData(i, double.parse(widget.firstDataList[i]), double.parse(widget.secondDataList[i])));
// rawBarGroups.add( makeGroupData(i, 10, 1.5));
}
showingBarGroups.clear();
showingBarGroups = rawBarGroups;
return Container(
height: 230.h,
color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: AspectRatio(
aspectRatio: 1,
child: BarChart(
BarChartData(
maxY: 20,
// minY: 0,
barTouchData: BarTouchData(
touchTooltipData: BarTouchTooltipData(
tooltipBgColor: Colors.grey,
getTooltipItem: (a, b, c, d) => null,
),
touchCallback: (FlTouchEvent event, response) {
if (response == null || response.spot == null) {
setState(() {
touchedGroupIndex = -1;
showingBarGroups = List.of(rawBarGroups);
});
return;
}
touchedGroupIndex = response.spot!.touchedBarGroupIndex;
setState(() {
if (!event.isInterestedForInteractions) {
touchedGroupIndex = -1;
showingBarGroups = List.of(rawBarGroups);
return;
}
showingBarGroups = List.of(rawBarGroups);
if (touchedGroupIndex != -1) {
var sum = 0.0;
for (final rod
in showingBarGroups[touchedGroupIndex].barRods) {
sum += rod.toY;
}
final avg = sum /
showingBarGroups[touchedGroupIndex]
.barRods
.length;
showingBarGroups[touchedGroupIndex] =
showingBarGroups[touchedGroupIndex].copyWith(
barRods: showingBarGroups[touchedGroupIndex]
.barRods
.map((rod) {
return rod.copyWith(
toY: avg, color: widget.avgColor);
}).toList(),
);
}
});
},
),
titlesData: FlTitlesData(
show: true,
rightTitles: const AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
topTitles: const AxisTitles(
sideTitles: SideTitles(showTitles: false),
),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: bottomTitles,
reservedSize: 42,
),
),
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 28,
interval: 1,
getTitlesWidget: leftTitles,
),
),
),
borderData: FlBorderData(
show: false,
),
barGroups: showingBarGroups,
gridData: const FlGridData(show: false),
),
),
),
),
const SizedBox(
height: 12,
),
],
),
),
);
}
Widget leftTitles(double value, TitleMeta meta) {
const style = TextStyle(
color: Color(0xff7589a2),
fontWeight: FontWeight.bold,
fontSize: 14,
);
String text;
if (value >= 0) {
text = widget.leftTitleList[0];
} else if (value >= 10) {
text = widget.leftTitleList[1];
} else if (value == 20) {
text = widget.leftTitleList[2];
} else if (value == 30) {
text = widget.leftTitleList[3];
}
else {
return Container();
}
return SideTitleWidget(
axisSide: meta.axisSide,
space: 0,
child: Text(text, style: style),
);
}
Widget bottomTitles(double value, TitleMeta meta) {
final titles = widget.bottomTitleList;
final Widget text = Text(
titles[value.toInt()],
style: const TextStyle(
color: Color(0xff7589a2),
fontWeight: FontWeight.bold,
fontSize: 14,
),
);
return SideTitleWidget(
axisSide: meta.axisSide,
space: 16, //margin top
child: text,
);
}
BarChartGroupData makeGroupData(int x, double y1, double y2) {
return BarChartGroupData(
barsSpace: 4,
x: x,
barRods: [
BarChartRodData(
toY: y1,
color: widget.leftBarColor,
width: width,
),
BarChartRodData(
toY: y2,
color: widget.rightBarColor,
width: width,
),
],
);
}
}
Editor is loading...
Leave a Comment