如何使用charts flutter创建条形图
介绍
charts_flutter 库是“用 Dart 原生编写的 Material Design 数据可视化库”。 您可以在 Flutter 应用程序中使用此库将数据显示为条形图、折线图、散点图、饼图等。
在本文中,您将使用 2008 年至 2015 年期间的魔兽世界订户数量数据,并使用 charts_flutter
将其显示为条形图。
先决条件
要完成本教程,您需要:
- 下载并安装 Flutter。
- 下载并安装Android Studio 或 Visual Studio Code。
- 建议为您的代码编辑器安装插件: 为 Android Studio 安装了 Flutter 和 Dart 插件。 为 Visual Studio Code 安装了 Flutter 扩展。
本教程已使用 Flutter v1.22.2、Android SDK v31.0.2 和 Android Studio v4.1 进行了验证。
第 1 步 — 设置项目
为 Flutter 设置好环境后,您可以运行以下命令来创建新应用程序:
flutter create charts_flutter_example
导航到新的项目目录:
cd charts_flutter_example
使用 flutter create
将生成一个演示应用程序,该应用程序将显示按钮被单击的次数。
第 2 步 — 添加 charts_flutter
插件
接下来,我们需要在 pubspec.yaml
中添加 charts_flutter
插件:
发布规范.yaml
dependencies: flutter: sdk: flutter charts_flutter: ^0.10.0
我们现在可以继续在您选择的 iOS 或 Android 模拟器或设备上运行它。
第三步——搭建应用程序
现在,在您的代码编辑器中打开 main.dart
。
用指向 HomePage
的 MaterialApp
替换此文件中的所有内容,该 home.dart
可以找到:
lib/main.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter_example/home.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: HomePage(), ); } }
接下来,创建一个新的 home.dart
文件并添加以下代码行:
lib/home.dart
import 'package:flutter/material.dart'; class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.red, title: Text("World of Warcraft Subscribers"), ), body: Center( child: Text("charts_flutter_example"), ), ); } }
现在我们已经建立了一个基础应用程序,我们可以继续为我们的条形图数据创建模型。
第 4 步 - 构建订阅者模型
我们的条形图将专注于显示特定年份的魔兽世界订户数量。
接下来,创建一个新的 subscriber_series.dart
文件并添加以下代码行:
lib/subscriber_series.dart
import 'package:flutter/foundation.dart'; import 'package:charts_flutter/flutter.dart' as charts; class SubscriberSeries { final String year; final int subscribers; final charts.Color barColor; SubscriberSeries( { @required this.year, @required this.subscribers, @required this.barColor } ); }
这使我们可以表示 year
和 subscribers
的数据。
第 5 步 — 创建数据
在本教程中,数据将在 HomePage
内部创建为 List<SubscriberSeries>
:
重新访问 home.dart
并添加以下代码行:
lib/home.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:charts_flutter_example/subscriber_series.dart'; class HomePage extends StatelessWidget { final List<SubscriberSeries> data = [ SubscriberSeries( year: "2008", subscribers: 10000000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2009", subscribers: 11000000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2010", subscribers: 12000000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2011", subscribers: 10000000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2012", subscribers: 8500000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2013", subscribers: 7700000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2014", subscribers: 7600000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ), SubscriberSeries( year: "2015", subscribers: 5500000, barColor: charts.ColorUtil.fromDartColor(Colors.red), ), ]; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.red, title: Text("World of Warcraft Subscribers"), ), body: Center( child: Text("charts_flutter_example"), ), ); } }
现在我们已经有了数据,我们需要做的就是创建条形图!
第 6 步 - 创建条形图
现在,创建一个新的 subscriber_chart.dart
文件并添加以下代码行:
lib/subscriber_chart.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:charts_flutter_example/subscriber_series.dart'; class SubscriberChart extends StatelessWidget { final List<SubscriberSeries> data; SubscriberChart({@required this.data}); }
此代码创建一个名为 SubscriberChart
的新 StatelessWidget
,它将 SubscriberSeries
作为 prop
接收。
然后我们可以使用这个 data
来构建我们的 charts.Series
,如下所示:
lib/subscriber_chart.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:charts_flutter_example/subscriber_series.dart'; class SubscriberChart extends StatelessWidget { final List<SubscriberSeries> data; SubscriberChart({@required this.data}); @override Widget build(BuildContext context) { List<charts.Series<SubscriberSeries, String>> series = [ charts.Series( id: "Subscribers", data: data, domainFn: (SubscriberSeries series, _) => series.year, measureFn: (SubscriberSeries series, _) => series.subscribers, colorFn: (SubscriberSeries series, _) => series.barColor ) ]; } }
domainFn
和 measureFn
用于比较 year
的 subscribers
数据。
我们还使用 colorFn
来潜在地传递 barColor
。
回想一下 home.dart
是如何使用 barColor
的:
SubscriberSeries( year: "2008", subscribers: 10000000, barColor: charts.ColorUtil.fromDartColor(Colors.blue), ),
我们可能希望在生产应用程序中将 barColor
设为可选,默认为 Colors.blue
(或您选择的颜色)。 在本教程中,一个条将被涂成红色,而其他条将被涂成蓝色。
让我们更新 build
函数以返回我们的图表:
lib/subscriber_chart.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:charts_flutter_example/subscriber_series.dart'; class SubscriberChart extends StatelessWidget { final List<SubscriberSeries> data; SubscriberChart({@required this.data}); @override Widget build(BuildContext context) { List<charts.Series<SubscriberSeries, String>> series = [ charts.Series( id: "Subscribers", data: data, domainFn: (SubscriberSeries series, _) => series.year, measureFn: (SubscriberSeries series, _) => series.subscribers, colorFn: (SubscriberSeries series, _) => series.barColor ) ]; return Container( height: 400, padding: EdgeInsets.all(20), child: Card( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: <Widget>[ Text( "World of Warcraft Subscribers by Year", style: Theme.of(context).textTheme.body2, ), Expanded( child: charts.BarChart(series, animate: true), ) ], ), ), ), ); } }
这段代码通过用 Card
将标记添加到 charts.BarChart
。
需要注意的关键是我们将 series
作为 required
参数传递给 charts.BarChart
:
charts.BarChart(series, animate: true)
此时,您的数据和图表就可以使用了。
第 7 步 — 显示图表
最后,在代码编辑器中重新访问 home.dart
并将 build
更改为使用 SubscriberChart
:
lib/home.dart
import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:charts_flutter_example/subscriber_series.dart'; import 'package:charts_flutter_example/subscriber_chart.dart'; class HomePage extends StatelessWidget { // ... @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.red, title: Text("World of Warcraft Subscribers"), ), body: Center( child: SubscriberChart( data: data, ) ), ); } }
保存更改并在模拟器中运行应用程序:
您的应用程序现在使用 charts_flutter
将数据显示为条形图。
结论
在本文中,您使用了 2008 年至 2015 年间《魔兽世界》订户数量的数据,并使用 charts_flutter
将其显示为条形图。
如果您想了解有关 Flutter 的更多信息,请查看 我们的 Flutter 主题页面 以获取练习和编程项目。