Flutter3安装插件、利用插件绘制图表

106 阅读4分钟

介绍:我的Flutter版本是3.10.6,Flutter项目是在VSCode工具中运行调试的。

Flutter插件

pub.dev/  这个网址有很多第三方库,需要什么插件去里面搜索就行。 安装插件有两种方法,命令行安装或者直接在pubspec.yaml文件中写插件名称和版本号。

方法1:

flutter pub add 插件名

flutter pub get

方法2:

到pub.dev上搜索想安装的插件,点击插件名和版本号右侧的复制按钮,就会直接复制好pubspec.yaml文件上需要的插件格式,直接粘贴即可,Ctrl+S保存该文件,VSCode就会自动执行flutter pub get把新添加的插件载入到项目中了。

接下来,用不同方法演示如何安装插件。

Logger

在VSCode中使用Flutter开发时,打印内容不能使用console.log,因为console.log是JavaScript中的一种打印方式,而Flutter是使用Dart语言开发的,因此需要使用Dart语言提供的打印方式来输出内容。 当然,是可以使用print输出语句的,就是会有蓝色波浪线的提示。使用print输出语句可以方便地在控制台中输出调试信息。但是,在生产环境中使用print输出语句可能会导致性能问题或者安全问题,因此Flutter会有下面的提示。

图片1.png

可以点击快速修复,把它ignore,就不会出现这个提示了,不修复其实也是会正常打印内容的。

图片2.png

在生产环境中,通常建议使用专业的日志框架来记录应用程序的运行信息。Dart语言中有许多日志框架可供选择,例如logging、logger等,这些日志框架可以提供更加丰富的功能,例如记录日志级别、输出到文件、格式化日志信息等。

所以下载logger插件用来打印数据。

pub.dev/packages/lo…

直接在pub.dev中复制它的名称和版本号: 图片2.png

粘贴内容到pubspec.yaml文件的dependencies中,保存文件,这个插件就会载入到项目中了。

图片3.png

引入、使用插件:

图片4.png 运行项目,效果如下:

图片5.png

要在整个Flutter项目的任何页面中方便地调用logger插件,可以将其封装成一个全局的单例类。之后,哪个地方需要打印日志内容,把这个文件引入就可以使用了。

图片13.png

当我在页面点击按钮时,就会触发打印日志的方法。

图片14.png

图表插件

pub.dev/中搜索图表插件,最终选择了下面这两个喜欢量多的插件。

syncfusion_flutter_charts:pub.dev/packages/sy…

fl_chart: pub.dev/packages/fl…

图片6.png

根据工作需求,在尝试了fl_chart和syncfusion_flutter_charts这两个插件,个人觉得syncfusion_flutter_charts相对好用一点,大家可以自行判断,根据需求选择合适的图表插件。

安装syncfusion_flutter_charts插件

图片7.png

在pubspec,yaml文件中就会出现这个插件的名称和版本号了,如下所示:

图片8.png

散点图

help.syncfusion.com/flutter/car…

图片9.png

效果如下:

图片10.png

封装公共组件,传递不同数据展示不同的散点图 新建一个文件scattter_page.dart文件,里面需要展示不同的散点图,所以,需要一个基础的图表组件,传入不同的值展示不同的图表数据。

图片11.png

在flutter中,如果要在不同的文件之间传递参数,可以通过构造函数的方式来实现。在这里,ScatterChart2 组件的构造函数用于接收外部传递的参数,并将它们保存到组件的属性中。当组件被创建时,这些属性将被用于绘制散点图表。

需要注意的是,如果希望在不同的文件之间传递参数,必须使用 const 关键字来声明构造函数。这是因为,只有使用 const 关键字声明的构造函数才能在不同的文件之间进行参数传递。如果没有使用 const 关键字,那么在不同的文件之间传递参数时,会出现编译错误。

效果如下:

图片12.png

散点图公共组件如下:

**import** 'dart:math';

**import** 'package:flutter/material.dart';

**import** 'package:syncfusion_flutter_charts/charts.dart';

 

**class** **ScatterChart2** **extends** **StatefulWidget** {

  *// 注意:如果希望在不同的文件之间传递参数,必须使用 const 关键字来声明构造函数!*

  *// 构造函数  接收参数*

  **const** **ScatterChart2**({

    **Key** **?**  key,

    **required** this.dataSource, *// 必传参数  散点数据*

    **required** this.chartTitle, *// 图表的标题*

    **required** this.color, *// 点的颜色*

  }) **:**  super(key **:**  key);

 

  **final** **List** **<** **Point** **>**  dataSource;

  **final** **String** **?**  chartTitle;

  **final** **Color** color;

 

  **@override**

  **State** **<** **ScatterChart2** **>**  **createState**() **=>**   **_ScatterChart2State**();

}

 

**class**  **_ScatterChart2State** **extends** **State** **<** **ScatterChart2** **>**  {

  *// 这个函数是用来创建一个环形的点数据,并将它们传递给 ScatterChart 组件的 dataSource 属性*

  **List** **<** **Point** **>**  **createRingPoints**(**double** radius, **int** numPoints) {

    **List** **<** **Point** **>**  points **=** [];

    **double** angle **=** **2**  *****  pi **/**  numPoints;

    **for** (**int** i **=** **0**; i **<**  numPoints; i **++** ) {

      **double** x **=** radius *****  **cos**(i *****  angle);

      **double** y **=** radius *****  **sin**(i *****  angle);

      points.**add**(**Point**(x, y));

    }

    **return** points;

  }

 

  **@override**

  **Widget** **build**(**BuildContext** context) {

    **return** **SfCartesianChart**(

      *// 设置散点图的标题*

      title **:**  widget.chartTitle **!=** null

          **?**  **ChartTitle**(

              text **:**  widget.chartTitle **!** ,

              textStyle **:**  **const** **TextStyle**(

                color **:**  **Colors**.white,

                fontWeight **:**  **FontWeight**.bold,

                fontSize **:**  **16**,

              ),

            )

          **:**  null,

      *// X 轴*

      primaryXAxis **:**  **NumericAxis**(

        minimum **:**  **-150**, *// 设置坐标轴最小的范围*

        maximum **:**  **150**, *// 设置坐标轴最大的范围*

        interval **:**  **50**, *// 设置坐标轴的间隔*

        labelStyle **:**  **const** **TextStyle**(color **:**  **Colors**.white),

        title **:**  **AxisTitle**(

            text **:**  'X 轴',

            textStyle **:**  **const** **TextStyle**(

              color **:**  **Colors**.white,

            )),

      primaryYAxis **:**  **NumericAxis**(

        minimum **:**  **-150**,

        maximum **:**  **150**,

        interval **:**  **50**,

        labelStyle **:**  **const** **TextStyle**(color **:**  **Colors**.white),

        title **:**  **AxisTitle**(

          text **:**  'Y 轴',

          textStyle **:**  **const** **TextStyle**(

            color **:**  **Colors**.white,

          ),

        ),

      ),

      series **:**   **<** **ChartSeries** **>** [

        **ScatterSeries** **<** **Point**, **double** **>** (

            dataSource **:**  widget.dataSource,

            *// xValueMapper 将数据源中的 x 值映射到图表的 x 轴上*

            xValueMapper **:**  (**Point** point, _) **=>**  point.x,

            *// yValueMapper 将数据源中的 y 值映射到图表的 y 轴上*

            yValueMapper **:**  (**Point** point, _) **=>**  point.y,

            color **:**  widget.color, *// 点的颜色*

            *// 更改散点的大小*

            markerSettings **:**  **const** **MarkerSettings**(height **:**  **6**, width **:**  **6**)),

      ],

    );

  }

}

 

**class** **Point** {

  **Point**(this.x, this.y);

 

  **final** **double** x;

  **final** **double** y;

}