1
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';
///柱狀圖-不可滑動-單數(shù)據(jù)
class ChartTestPage extends StatelessWidget {
const ChartTestPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("chart_flutter")),
body: Column(children: [Container(height: 240, child: _simpleBar())]),
);
}
Widget _simpleBar() {
var random = Random();
var data = [
OrdinalSales('2011', random.nextInt(100)),
OrdinalSales('2012', random.nextInt(100)),
OrdinalSales('2013', random.nextInt(100)),
OrdinalSales('2014', random.nextInt(100)),
OrdinalSales('2015', random.nextInt(100)),
OrdinalSales('2016', random.nextInt(100)),
];
var seriesList = [
charts.Series<OrdinalSales, String>(
id: 'Sales',
colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, //柱體顏色
domainFn: (OrdinalSales sales, _) => sales.year,
measureFn: (OrdinalSales sales, _) => sales.sales,
labelAccessorFn: (OrdinalSales sales, _) => "${sales.sales}", //柱體最上邊數(shù)字
data: data, //數(shù)據(jù)
)
];
return charts.BarChart(
seriesList,
animate: true,
barRendererDecorator: new charts.BarLabelDecorator<String>(), //顯示柱體最上邊數(shù)字
vertical: true, //true:垂直展示,false:水平展示
);
}
}
class OrdinalSales {
final String year;
final int sales;
OrdinalSales(this.year, this.sales);
}
2
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';
///柱狀圖-單數(shù)據(jù)-可滑動
class ChartTestPage1 extends StatelessWidget {
const ChartTestPage1({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("chart_flutter")),
body: Column(children: [Container(height: 240, child: _simpleBar())]),
);
}
Widget _simpleBar() {
var random = Random();
var data = [
OrdinalSales('2011', random.nextInt(100)),
OrdinalSales('2012', random.nextInt(100)),
OrdinalSales('2013', random.nextInt(100)),
OrdinalSales('2014', random.nextInt(100)),
OrdinalSales('2015', random.nextInt(100)),
OrdinalSales('2016', random.nextInt(100)),
];
var seriesList = [
charts.Series<OrdinalSales, String>(
id: 'Sales',
colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, //柱體顏色
domainFn: (OrdinalSales sales, _) => sales.year,
measureFn: (OrdinalSales sales, _) => sales.sales,
labelAccessorFn: (OrdinalSales sales, _) => "${sales.sales}", //柱體最上邊數(shù)字
data: data,
)
];
///左右滑動
return charts.BarChart(
seriesList,
animate: true, // 動畫
behaviors: [
charts.SlidingViewport(), //滑動窗口
charts.PanAndZoomBehavior(), //平移和縮放行為
],
barRendererDecorator: new charts.BarLabelDecorator<String>(), //顯示柱體最上邊數(shù)字
domainAxis: new charts.OrdinalAxisSpec(viewport: new charts.OrdinalViewport('2011', 4)), //從2011,界面顯示4個,其他隱
vertical: true, //true:垂直展示,false:水平展示藏
);
}
}
class OrdinalSales {
final String year;
final int sales;
OrdinalSales(this.year, this.sales);
}
3
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';
///左右滑動-柱狀圖-多數(shù)據(jù)
class ChartTestPage2 extends StatelessWidget {
const ChartTestPage2({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("chart_flutter")),
body: Column(children: [Container(height: 250, child: _simpleBar())]),
);
}
Widget _simpleBar() {
var random = Random();
var data1 = [
OrdinalSales('2011', random.nextInt(100)),
OrdinalSales('2012', random.nextInt(100)),
OrdinalSales('2013', random.nextInt(100)),
OrdinalSales('2014', random.nextInt(100)),
OrdinalSales('2015', random.nextInt(100)),
OrdinalSales('2016', random.nextInt(100)),
OrdinalSales('2017', random.nextInt(100)),
OrdinalSales('2018', random.nextInt(100)),
];
var data2 = [
OrdinalSales('2011', random.nextInt(100)),
OrdinalSales('2012', random.nextInt(100)),
OrdinalSales('2013', random.nextInt(100)),
OrdinalSales('2014', random.nextInt(100)),
OrdinalSales('2015', random.nextInt(100)),
OrdinalSales('2016', random.nextInt(100)),
OrdinalSales('2017', random.nextInt(100)),
OrdinalSales('2018', random.nextInt(100)),
];
var data3 = [
OrdinalSales('2011', random.nextInt(100)),
OrdinalSales('2012', random.nextInt(100)),
OrdinalSales('2013', random.nextInt(100)),
OrdinalSales('2014', random.nextInt(100)),
OrdinalSales('2015', random.nextInt(100)),
OrdinalSales('2016', random.nextInt(100)),
OrdinalSales('2017', random.nextInt(100)),
OrdinalSales('2018', random.nextInt(100)),
];
var seriesList = [
charts.Series<OrdinalSales, String>(
id: 'Sales1',
colorFn: (_, __) => charts.ColorUtil.fromDartColor(Color(0xFFE41E31)),
domainFn: (OrdinalSales sales, _) => sales.year,
measureFn: (OrdinalSales sales, _) => sales.sales,
labelAccessorFn: (OrdinalSales sales, _) => "${sales.sales}", //柱體最上邊數(shù)字
data: data1,
),
charts.Series<OrdinalSales, String>(
id: 'Sales2',
colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, //柱體顏色
domainFn: (OrdinalSales sales, _) => sales.year,
measureFn: (OrdinalSales sales, _) => sales.sales,
labelAccessorFn: (OrdinalSales sales, _) => "${sales.sales}",
data: data2,
),
charts.Series<OrdinalSales, String>(
id: 'Sales3',
colorFn: (_, __) => charts.MaterialPalette.yellow.shadeDefault,
domainFn: (OrdinalSales sales, _) => sales.year,
measureFn: (OrdinalSales sales, _) => sales.sales,
labelAccessorFn: (OrdinalSales sales, _) => "${sales.sales}", //柱體最上邊數(shù)字
data: data3,
),
];
///左右滑動
return charts.BarChart(
seriesList, //數(shù)據(jù)
animate: true, //動畫
behaviors: [
charts.SlidingViewport(), //滑動窗口
charts.PanAndZoomBehavior(), //平移和縮放行為
//顯示說明時的字體大小和顏色
new charts.SeriesLegend(
entryTextStyle: charts.TextStyleSpec(
fontSize: 12,
color: charts.Color.black,
),
),
],
barGroupingType: charts.BarGroupingType.stacked, //多個數(shù)據(jù)時的展示方式 // stacked:上下多組 //grouped左右多組
barRendererDecorator: new charts.BarLabelDecorator<String>(), //顯示柱頭文本
domainAxis: new charts.OrdinalAxisSpec(viewport: new charts.OrdinalViewport('2011', 4)), //從2011,顯示四個,其他隱藏
vertical: true, //true:垂直展示,false:水平展示
);
}
}
class OrdinalSales {
final String year;
final int sales;
OrdinalSales(this.year, this.sales);
}
4
import 'package:charts_flutter/flutter.dart' as charts;
import 'package:flutter/material.dart';
import 'package:imes_base_plugins/common/logs.dart';
import 'chart_histogram_model.dart';
///柱狀圖
class ChartHistogramWidget extends StatefulWidget {
final String title; //從哪來的
final List<String> names; //說明
final Map<String, Color> nameColorMap; //說明-顏色 對照表
final List<List<OrdinalSales>> data; //數(shù)據(jù)
final bool vertical; //true:垂直展示,false:水平展示
final bool animate; //true:開啟動畫,false:關(guān)閉動畫
final bool sliding; //true:開啟滑動,false:關(guān)閉滑動
final bool barGroupingType; //true:左右多組展示,false:上下多組展示
final bool barRendererDecorator; //true:顯示柱頭文本,隱藏柱頭文本
final String xStart; //從 xStart 顯示
final int xCount; //顯示 xCount 個
final int maxBarWidthPx; //每個柱子的最大寬度
const ChartHistogramWidget({
Key key,
@required this.title,
@required this.names,
@required this.nameColorMap,
@required this.data,
this.vertical = true,
this.animate = true,
this.sliding = true,
this.barGroupingType = true,
this.barRendererDecorator = true,
this.xStart,
this.xCount,
this.maxBarWidthPx = 36,
}) : super(key: key);
@override
State<ChartHistogramWidget> createState() => _ChartHistogramWidgetState();
}
class _ChartHistogramWidgetState extends State<ChartHistogramWidget> {
//數(shù)據(jù)
List<charts.Series<OrdinalSales, String>> _seriesList = [];
///initState
@override
void initState() {
super.initState();
logs("進(jìn)入: ${widget.title}-圖表");
_seriesList = _getSeriesList(widget.data ?? []);
}
///dispose
@override
void dispose() {
logs("結(jié)束: ${widget.title}-圖表");
super.dispose();
}
///build
@override
Widget build(BuildContext context) {
logs("柱狀圖--說明: ${widget.names}");
logs("名字顏色對照: ${widget.nameColorMap}");
logs("數(shù)據(jù): $_seriesList");
return charts.BarChart(
_seriesList, //數(shù)據(jù)
animate: widget.animate, //動畫
//行為
behaviors: widget.sliding
? [
charts.SlidingViewport(), //滑動窗口
charts.PanAndZoomBehavior(), //平移和縮放行為
//顯示說明時的字體大小和顏色
// new charts.SeriesLegend(
// entryTextStyle: charts.TextStyleSpec(fontSize: 12, color: charts.Color.black),
// ),
]
: [],
//多數(shù)據(jù)展示方式 stacked:上下多組 grouped左右多組
barGroupingType: widget.barGroupingType ? charts.BarGroupingType.grouped : charts.BarGroupingType.stacked,
//顯示柱頭文本
barRendererDecorator: widget.barRendererDecorator ? charts.BarLabelDecorator<String>() : null,
//從 xStart 顯示,顯示 xCount 個
domainAxis: charts.OrdinalAxisSpec(
viewport: charts.OrdinalViewport(widget.xStart ?? widget.data[0][0].x, widget.xCount ?? widget.data[0].length),
),
//true:垂直展示,false:水平展示
vertical: widget.vertical,
//渲染器-設(shè)置外形
defaultRenderer: charts.BarRendererConfig<String>(
//多數(shù)據(jù)展示方式 stacked:上下多組 grouped左右多組
groupingType: widget.barGroupingType ? charts.BarGroupingType.grouped : charts.BarGroupingType.stacked,
//每個柱子的最大寬度
maxBarWidthPx: widget.maxBarWidthPx,
//
barRendererDecorator: charts.BarLabelDecorator<String>(),
),
);
}
//數(shù)據(jù)...
///獲取 seriesList
_getSeriesList(List<List<OrdinalSales>> data) {
//空
List<charts.Series<OrdinalSales, String>> newList = [];
//遍歷
for (int i = 0; i < data.length; i++) {
//創(chuàng)建series
var series = charts.Series<OrdinalSales, String>(
id: widget.names[i],
colorFn: (_, __) => charts.ColorUtil.fromDartColor(widget.nameColorMap[widget.names[i]]), // 每個柱體的顏色
domainFn: (OrdinalSales sales, _) => sales.x, //x軸
measureFn: (OrdinalSales sales, _) => sales.y, //y軸
labelAccessorFn: (OrdinalSales sales, _) => "${sales.y}", //顯示柱頭文本
data: data[i], //數(shù)據(jù)
);
//添加
newList.add(series);
}
return newList;
}
}
///數(shù)據(jù)模型
class OrdinalSales {
final String x;
final int y;
OrdinalSales(this.x, this.y);
}
參考:
http://www.lxweimin.com/p/75f112d54028