csci4100-chartdemo/lib/done.dart

144 lines
3.7 KiB
Dart

import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'dart:math';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: Padding(
padding: const EdgeInsets.all(20),
child: RotatedBox(
quarterTurns: 1,
child: MyBarChart(),
),
),
);
}
}
class MyBarChart extends StatelessWidget {
MyBarChart({super.key});
final List<ChartData> data = ChartData.exampleData();
final double _chartTextRotation = -1.57079633;
final double _leftTextWidth = 70;
double get maxY => max(
data.map((d) => d.gpa).reduce((a, b) => max(a, b)),
data.map((d) => d.year).reduce((a, b) => max(a, b)),
).toDouble();
SideTitleWidget _getBottomSideTitleWidget(double y, TitleMeta meta) {
return SideTitleWidget(
angle: _chartTextRotation,
axisSide: meta.axisSide,
child: Center(child: Text(meta.formattedValue)),
);
}
SideTitleWidget _getLeftSideTitleWidget(double x, TitleMeta meta) {
return SideTitleWidget(
angle: _chartTextRotation,
axisSide: meta.axisSide,
child: SizedBox(
width: _leftTextWidth,
child: Align(
alignment: Alignment.centerRight,
child: Text(
data[x.floor()].name,
overflow: TextOverflow.ellipsis,
),
),
),
);
}
List<BarChartGroupData> _chartGroupData() {
return data
.map((d) => BarChartGroupData(
x: data.indexOf(d),
barRods: [
BarChartRodData(toY: d.year.toDouble(), color: Colors.orange),
BarChartRodData(toY: d.gpa.toDouble(), color: Colors.indigo)
],
))
.toList();
}
BarChartData _chartData() {
return BarChartData(
barGroups: _chartGroupData(),
maxY: maxY + 0.5,
titlesData: FlTitlesData(
show: true,
topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)),
leftTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)),
rightTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 40,
showTitles: true,
getTitlesWidget: _getBottomSideTitleWidget)),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: _leftTextWidth + 20,
showTitles: true,
getTitlesWidget: _getLeftSideTitleWidget)),
),
);
}
@override
Widget build(BuildContext context) {
return BarChart(_chartData());
}
}
class ChartData {
ChartData({required this.name, required this.gpa, required this.year});
String name;
int gpa;
int year;
static List<ChartData> exampleData() {
return [
ChartData(name: "John Doe", gpa: 2, year: 1),
ChartData(name: "Jane Doe", gpa: 3, year: 2),
ChartData(name: "Doe", gpa: 4, year: 3),
];
}
}