Bar Charts in Flutter

Jamie
Jamie Dev
Published in
3 min readOct 16, 2020

In this article, we will see how to draw bar charts in flutter.

Watch Video

To draw charts in flutter, we need to add a dependency. So open your pubspec.yaml file and add the below dependency below dependencies.

Dependencies

flutter: 
sdk: flutter

# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
...
charts_flutter: ^0.9.0

After this, run ‘flutter packages get’ to add the package.

Once the plugin is installed, import it in the file you want to use it.

import 'package:charts_flutter/flutter.dart' as charts;

Let’s create some sample data for the charts first

First we will create a class that holds our chart data. The class here is called ‘Sales’

class Sales {
final String year;
final int sales;

Sales(this.year, this.sales);
}

Now we will create a list to hold a series of Chart data.
_createRandomData creates some random Sales Data.

List<charts.Series> seriesList;

static List<charts.Series<Sales, String>> _createRandomData() {
final random = Random();

final desktopSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

return [
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: desktopSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.blue.shadeDefault;
},
)
];

}

Add the Chart

First we will initialize the series list, then we will pass it to the BarChart constructor.

@override
void initState() {
super.initState();
seriesList = _createRandomData();
}

barChart() {
return charts.BarChart(
seriesList,
animate: true,
vertical: false,
);
}

Ok. It’s done. it’s that simple.

if you want to add a stacked or grouped bar chart, just add more series like this.

static List<charts.Series<Sales, String>> _createRandomData() {
final random = Random();

final desktopSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

final tabletSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

final mobileSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

return [
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: desktopSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.blue.shadeDefault;
},
),
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: tabletSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.green.shadeDefault;
},
),
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: mobileSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.teal.shadeDefault;
},
)
];
}

barChart() {
return charts.BarChart(
seriesList,
animate: true,
vertical: false,
barGroupingType: charts.BarGroupingType.grouped,
defaultRenderer: charts.BarRendererConfig(
groupingType: charts.BarGroupingType.grouped,
strokeWidthPx: 1.0,
),
// domainAxis: charts.OrdinalAxisSpec(
// renderSpec: charts.NoneRenderSpec(),
),
);
}

Complete Code

import 'package:flutter/material.dart';
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;

class ChartsDemo extends StatefulWidget {
//
ChartsDemo() : super();

final String title = "Charts Demo";

@override
ChartsDemoState createState() => ChartsDemoState();
}

class ChartsDemoState extends State<ChartsDemo> {
//
List<charts.Series> seriesList;

static List<charts.Series<Sales, String>> _createRandomData() {
final random = Random();

final desktopSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

final tabletSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

final mobileSalesData = [
Sales('2015', random.nextInt(100)),
Sales('2016', random.nextInt(100)),
Sales('2017', random.nextInt(100)),
Sales('2018', random.nextInt(100)),
Sales('2019', random.nextInt(100)),
];

return [
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: desktopSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.blue.shadeDefault;
},
),
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: tabletSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.green.shadeDefault;
},
),
charts.Series<Sales, String>(
id: 'Sales',
domainFn: (Sales sales, _) => sales.year,
measureFn: (Sales sales, _) => sales.sales,
data: mobileSalesData,
fillColorFn: (Sales sales, _) {
return charts.MaterialPalette.teal.shadeDefault;
},
)
];
}

barChart() {
return charts.BarChart(
seriesList,
animate: true,
vertical: false,
barGroupingType: charts.BarGroupingType.grouped,
defaultRenderer: charts.BarRendererConfig(
groupingType: charts.BarGroupingType.grouped,
strokeWidthPx: 1.0,
),
domainAxis: charts.OrdinalAxisSpec(
renderSpec: charts.NoneRenderSpec(),
),
);
}

@override
void initState() {
super.initState();
seriesList = _createRandomData();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
padding: EdgeInsets.all(20.0),
child: barChart(),
),
);
}
}

class Sales {
final String year;
final int sales;

Sales(this.year, this.sales);
}

--

--

Jamie
Jamie Dev

Flutter, React Native, Android, iOS App developer.