Flutter 简单绘制一个折线统计图

折线统计图是以折线的上升或下降来表示统计数量的增减变化的统计图。折线统计图用折线的起伏表示数据的增减变化情况,它不仅可以表示数量的多少,而且可以反映数据的增减变化情况。

在生活中,我们经常在数学问题中用到统计图表来分析数据,判断数据走向。

在天气预报中用折线统计图反映气温的变化情况;在人口普查的过程中用折线统计图反映人口的变动情况;在商超销售的过程中用折线统计图显示销售情况,分析进货量。

今天我们就在 flutter 环境中利用fl_chart 插件来简单制作一个折线统计图。


开发步骤:

1.第一步我们简单了解一下我们用到的 fl_chart 插件,熟悉它的使用方法和应用场景。


fl_chart 插件

2.查看 fl_chart 插件的源代码,查看它的属性和方法。

折线统计图:

const LineChart(

this.data, {

Duration swapAnimationDuration = const Duration(milliseconds: 150),

Curve swapAnimationCurve = Curves.linear,

})

统计图数据项:

LineChartData({

List? lineBarsData,

List? betweenBarsData,

FlTitlesData? titlesData,

ExtraLinesData? extraLinesData, //外部行数据

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

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

FlGridData? gridData,

FlBorderData? borderData,

FlAxisTitleData? axisTitleData,

RangeAnnotations? rangeAnnotations, //范围注释

double? minX,

double? maxX,

double? minY,

double? maxY,

FlClipData? clipData,

Color? backgroundColor,

})

LineChartData 属性

折线图数据及图表设计:

LineChartBarData({

List? spots,

bool? show,

List? colors,

List? colorStops,

Offset? gradientFrom,

Offset? gradientTo,

double? barWidth,

bool? isCurved,

double? curveSmoothness,

bool? preventCurveOverShooting,

double? preventCurveOvershootingThreshold,

bool? isStrokeCapRound,

BarAreaData? belowBarData,

BarAreaData? aboveBarData,

FlDotData? dotData,

List? showingIndicators,

List? dashArray,

Shadow? shadow,

bool? isStepLineChart,

LineChartStepData? lineChartStepData,

})


LineChartBarData 属性

详细文档请点击:fl_chart class 

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

        新建 Flutter 项目,命名为 LineChart_demo 。

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

        显示运行成功即可。

4.导入成功后在项目文件中的【lib 文件夹】编写程序代码。

整体布局代码:

Scaffold(

appBar:AppBar(

title:const Text('Flutter Line Statistical Chart'),

      backgroundColor: Colors.greenAccent,

  ),

  body:Center(

child:Column(

mainAxisAlignment: MainAxisAlignment.center,

      children: [

LineCharts(),

        Padding(

padding:const EdgeInsets.all(15.0),

            child:Text(

"近年本科学生考研人数统计图",

                style:TextStyle(

fontSize:27,

                    color: Colors.purple,

                    fontWeight: FontWeight.w600,

                    fontStyle: FontStyle.italic

                ),

            ),

        ),

      ],

    ),

  ),

);

折线统计图构建代码:

Widget LineCharts(){

    const valueTextStyle=TextStyle(fontSize: 12, color: Colors.orangeAccent);

    return SizedBox(

      width: 360,

      height: 420,

      child: LineChart(

        LineChartData(

          lineTouchData: LineTouchData(enabled: true,),

          lineBarsData: [

            LineChartBarData(

              spots: [

                FlSpot(0, 177),

                FlSpot(1, 201),

                FlSpot(2, 238),

                FlSpot(3, 290),

                FlSpot(4, 341),

                FlSpot(5, 377),

              ],

              isCurved: true,

              barWidth: 1.6,

              colors: [

                Colors.black,

              ],

              belowBarData: BarAreaData(

                show: true,

                colors: [Colors.lightBlue.withOpacity(0.5)],

                cutOffY: cutOffYValue,

                applyCutOffY: true,

              ),

              aboveBarData: BarAreaData(

                show: true,

                colors: [Colors.lightGreen.withOpacity(0.6)],

                cutOffY: cutOffYValue,

                applyCutOffY: true,

              ),

              dotData: FlDotData(

                show: true,

              ),

            ),

          ],

          titlesData: FlTitlesData(

            bottomTitles: SideTitles(

                showTitles: true,

                reservedSize: 10,

                getTextStyles: (value) => yearTextStyle,

                getTitles: (value) {

                  switch (value.toInt()) {

                    case 0:

                      return '2016';

                    case 1:

                      return '2017';

                    case 2:

                      return '2018';

                    case 3:

                      return '2019';

                    case 4:

                      return '2020';

                    case 5:

                      return '2021';

                    default:

                      return '';

                  }

                }

            ),

            leftTitles: SideTitles(

              showTitles: true,

              getTextStyles: (value) => valueTextStyle,

              getTitles: (value) {

                return '${value}';

              },

            ),

          ),

          axisTitleData: FlAxisTitleData(

              leftTitle: AxisTitle(showTitle: true, titleText: '考研人数(万)', margin: 12,textAlign: TextAlign.center,textStyle: yearTextStyle),

              bottomTitle: AxisTitle(

                  showTitle: true,

                  margin: 10,

                  titleText: '年份',

                  textStyle: yearTextStyle,

                  textAlign: TextAlign.right

              ),

          ),

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

          gridData: FlGridData(

            show: true,

            getDrawingHorizontalLine: (value) {

              if(value == 177 || value == 201 ||  value == 238 || value == 290 || value == 341 || value == 390){

                return FlLine(

                  color: const Color(0xfff7434d),

                  strokeWidth: 1,

                );

              }

            },

            getDrawingVerticalLine: (value) {

              return FlLine(

                color: const Color(0xff279885),

                strokeWidth: 1,

              );

            },

          ),

        ),

      ),

    );

  }

5.UI 主界面布局层次如下图:


布局层次图

6.检查项目文件中程序代码是否有错误,然后配置主运行文件 main.dart 。

7.检查完后运行主文件 main.dart ,观察界面效果。

8.运行显示如下图所示:


手机端运行结果


Web 端运行结果



继续学习 flutter

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

推荐阅读更多精彩内容