19.1.flutter-柱狀圖

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評論 2 372