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 createState() => _MyHomePageState(); } class _MyHomePageState extends State { @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 data = ChartData.exampleData(); final double _chartTextRotation = -1.57079633; 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: Align( alignment: Alignment.centerRight, child: Text(data[x.floor()].name), ), ); } List _chartGroupData() { return data .map((d) => BarChartGroupData( x: data.indexOf(d), barRods: [ BarChartRodData(toY: d.year.toDouble()), BarChartRodData(toY: d.gpa.toDouble()) ], )) .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: 50, 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 exampleData() { return [ ChartData(name: "John", gpa: 2, year: 1), ChartData(name: "Jane", gpa: 3, year: 2), ChartData(name: "Doe", gpa: 4, year: 3), ]; } }