Flutter 利用 fl_chart 插件绘制统计图表(折线统计图)

在生活中,我们经常在数学问题中用到统计图表来分析数据,判断数据走向。在很多软件中,我们也会在周末或月末收到数据的汇总图表,方便我们查看数据,分析问题,今天我们就在 flutter 环境中利用 fl_chart 简单描摹一下。

类似:

统计图


1.我们了解作图工具 fl_chart (插件)。

        fl_chart 是一个强大的Flutter图表库,目前支持折线图、条形图和饼图。

2.我们查看源代码,了解使用方法和组件属性。

        折线统计图

const LineChart(

this.data, {

Duration swapAnimationDuration = const Duration(milliseconds: 150),

Curve swapAnimationCurve = Curves.linear,

})


        统计图数据项

LineChartData({

List<LineChartBarData>? lineBarsData,

List<BetweenBarsData>? betweenBarsData,

FlTitlesData? titlesData,

ExtraLinesData? extraLinesData, //外部行数据

LineTouchData? lineTouchData, //线路接触数据

List<ShowingTooltipIndicators>? showingTooltipIndicators, //显示工具提示指示器

FlGridData? gridData,

FlBorderData? borderData,

FlAxisTitleData? axisTitleData,

RangeAnnotations? rangeAnnotations, //范围注释

double? minX,

double? maxX,

double? minY,

double? maxY,

FlClipData? clipData,

Color? backgroundColor,

})


参数说明



        折线图条形图数据

LineChartBarData({

List<FlSpot>? spots,

bool? show,

List<Color>? colors,

List<double>? colorStops,

Offset? gradientFrom,

Offset? gradientTo,

double? barWidth,

bool? isCurved,

double? curveSmoothness,

bool? preventCurveOverShooting,

double? preventCurveOvershootingThreshold,

bool? isStrokeCapRound,

BarAreaData? belowBarData,

BarAreaData? aboveBarData,

FlDotData? dotData,

List<int>? showingIndicators,

List<int>? dashArray,

Shadow? shadow,

bool? isStepLineChart,

LineChartStepData? lineChartStepData,

})


参数说明2



想要更加细致的了解fl_chart


3.新建项目并导入依赖包。

    新建项目,命名为 Chart_demo 

    在项目文件中找到 pubspec.yaml 文件,然后在 dependencies: 标签下添加 fl_chart: ^0.30.0 依赖,接下来运行 pub get 命令。

4.如果依赖导入成功,我们在 lib 文件夹中编写代码。

图表文件:

LineChartData mainData() {

    return LineChartData(

      /*axisTitleData: FlAxisTitleData(

      ),*/

      //clipData: FlClipData.vertical()

      /*extraLinesData: ExtraLinesData(

        extraLinesOnTop: true,

        verticalLines: [

          VerticalLine(x: 8.9,label: VerticalLineLabel(show: true) ,),

        ],

      ),*/

      clipData: FlClipData(left: true, bottom: true, top: true, right: true),

      gridData: FlGridData(

        show: true,

        drawHorizontalLine: true,

        drawVerticalLine: true,

        getDrawingHorizontalLine: (value) {

          return FlLine(

            color: const Color(0xff37434d),

            strokeWidth: 1,

          );

        },

        getDrawingVerticalLine: (value) {

          return FlLine(

            color: const Color(0xff37434d),

            strokeWidth: 1,

          );

        },

      ),

      titlesData: FlTitlesData(

        show: true,

        bottomTitles: SideTitles(

          showTitles: true,

          reservedSize: 22,

          getTextStyles: (context,value) => const TextStyle(

              color: Color(0xff68737d),

              fontWeight: FontWeight.bold,

              fontSize: 16,

          ),

          getTitles: (value) {

            if(value.toInt()%2==0){

              int value2=value.toInt()+1;

              return value2.toString()+'月';

            }

            return (value.toInt()+1).toString();

          },

          margin: 8,

        ),

        leftTitles: SideTitles(

          showTitles: true,

          getTextStyles: (context,value) => TextStyle(

            color: Color(0xff67727d),

            fontWeight: FontWeight.bold,

            fontSize: 15,

          ),

          getTitles: (value) {

            switch (value.toInt()) {

              case 1:

                return '10箱';

              case 2:

                return '20箱';

              case 3:

                return '30箱';

              case 4:

                return '40箱';

              case 5:

                return '50箱';

              case 6:

                return '60箱';

            }

            return '';

          },

          reservedSize: 28,

          margin: 12,

        ),

      ),

      borderData: FlBorderData(show: true, border: Border.all(color: const Color(0xff37434d), width: 1)),

      minX: 0,

      maxX: 11,

      minY: 0,

      maxY: 7,

      lineBarsData:linesBarData1(),

    );

  }

  List<LineChartBarData> linesBarData1() {

    final LineChartBarData lineChartBarData1 = LineChartBarData(

      spots: [

        FlSpot(0, 5),

        FlSpot(1, 4),

        FlSpot(2, 1),

        FlSpot(3, 2),

        FlSpot(4, 2.5),

        FlSpot(5, 1),

        FlSpot(6, 2),

        FlSpot(7, 4),

        FlSpot(8, 3),

        FlSpot(9, 5),

        FlSpot(10, 3),

        FlSpot(11, 4),

      ],

      isCurved: true,

      colors: gradientColors,

      barWidth: 5,

      isStrokeCapRound: true,

      dotData: FlDotData(

        show: false,

      ),

      belowBarData: BarAreaData(

        show: true,

        colors: gradientColors.map((color) => color.withOpacity(0.3)).toList(),

      ),

    );

    return [lineChartBarData1];

  }


页面布局文件:

Scaffold(

appBar:AppBar(title:Text("Chart 图表"),),

  body:Center(

child:Stack(

children: [

Container(

width:600,

          decoration:const BoxDecoration(

borderRadius:BorderRadius.all(

Radius.circular(21),

            ),

            color:Color(0xff232d37),

          ),

          child:Padding(

padding:const EdgeInsets.only(right:22.0, left:18.0, top:34, bottom:12),

            child:LineChart(

mainData(),

            ),

          ),

        ),

        Positioned(

child:Text('2021年哇哈哈饮品销量统计',

            style:TextStyle(fontSize:18, color: Colors.blue,decoration: TextDecoration.none),

          ),

          top:2,

          right:0,

        ),

        Positioned(

top:5,

          left:6,

          child:Text(

'销量',

            style:TextStyle(

fontSize:15, color: Colors.white,decoration: TextDecoration.none),

          ),

        ),

      ],

    ),

  ),

);




5.检查代码中是否有错误。

6.运行主文件 main.dart ,观察统计图效果。

运行结果如图:

运行结果

继续学习flutter

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容