Flutter饼状图绘制插件easy_pie_chart的使用

Flutter饼状图绘制插件easy_pie_chart的使用

Easy Pie Chart Package

Easy Pie Chart 插件为Flutter应用程序提供了一个多用途的饼状图小部件。它提供了多种自定义选项,可以创建交互性强且视觉效果吸引人的饼状图。

特性

  • 三种饼状图变体:

    • Crust: 仅有边框,无填充。
    • TriCrust: 每个饼片周围都有边框。
    • Fill: 填充的饼片。
  • 交互式饼片:

    • 每个饼片都是交互式的,并响应用户点击。
  • 自定义选项:

    • 可调整饼片之间的间隙。
    • 控制边框边缘样式(圆角、方角等)。
    • 饼状图的起始角度可自定义。
    • 在饼状图内部显示文本或小部件的选项。
    • 动画:顺时针和逆时针动画,具有可调持续时间。

入门指南

要使用此插件,请在您的 pubspec.yaml 文件中添加以下行:

dependencies:
  easy_pie_chart: ^version

或者,在项目的根目录下运行命令:

flutter pub add easy_pie_chart

然后,在Dart文件中导入该包:

import 'package:easy_pie_chart/easy_pie_chart.dart';

使用示例

以下是一个简单的创建Easy pie chart的示例:

PieChart(
  children: [
    PieData(value: 30, color: Colors.red),
    PieData(value: 50, color: Colors.blue),
  ],
)

Demo GIF

更多示例可以在本仓库的 /example 文件夹中查看。

属性说明

名称 描述 默认值 数据类型 是否必填
children 表示每个饼片的PieData对象列表。 - List 是
showValue 确定是否在每个饼片上显示值。 true bool 否
start 饼状图的起始角度(以度为单位)。 -90 double 否
gap 饼片之间的间隔。 0.0 double 否
borderWidth crust和triCrust类型的饼图边框宽度。 30.0 double 否
borderEdge crust类型的饼图边框边缘形状。 StrokeCap.round StrokeCap 否
shouldAnimate 确定饼状图在构建时是否顺时针动画。 true bool 否
animateDuration 动画持续时间。 1500ms Duration? 否
animateFromEnd 如果为true,则动画从逆时针开始。 false bool 否
centerText 显示在饼状图中心的文本。 null String? 否
style centerText的TextStyle。 null TextStyle? 否
centerStyle 显示在每个饼片上的值的TextStyle。 null TextStyle? 否
pieType 定义饼状图类型(crust, triCrust, fill)。 PieType.crust PieType 否
onTap 当饼片被点击时触发的函数。 null void Function(int)? 否

示例代码

以下是完整的示例代码,演示了如何使用 easy_pie_chart 插件来创建不同类型的饼状图:

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: const Example(),
    );
  }
}

class Example extends StatefulWidget {
  const Example({Key? key}) : super(key: key);

  @override
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  final List<PieData> pies = [
    PieData(value: 0.15, color: Colors.yellow),
    PieData(value: 0.35, color: Colors.cyan),
    PieData(value: 0.45, color: Colors.lightGreen),
  ];
  String tapIndex = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Demo Pie Chart')),
      body: SingleChildScrollView(
        child: Column(
          children: [
            const SizedBox(height: 30),
            CustomCard(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  EasyPieChart(
                    key: const Key('pie 1'),
                    children: pies,
                    borderEdge: StrokeCap.butt,
                    pieType: PieType.crust,
                    onTap: (index) {},
                    style: const TextStyle(color: Colors.pinkAccent, fontSize: 10),
                    gap: 0.02,
                    start: 0,
                    size: 130,
                  ),
                  EasyPieChart(
                    key: const Key('pie 2'),
                    children: pies,
                    pieType: PieType.crust,
                    onTap: (index) {
                      tapIndex = index.toString();
                      setState(() {});
                    },
                    gap: 0.1,
                    start: 0,
                    animateFromEnd: true,
                    size: 130,
                    child: Center(child: Text(tapIndex)),
                  ),
                ],
              ),
            ),
            const SizedBox(height: 30),
            CustomCard(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  EasyPieChart(
                    key: const Key('pie 3'),
                    children: pies,
                    borderEdge: StrokeCap.butt,
                    borderWidth: 10,
                    pieType: PieType.triCrust,
                    onTap: (index) {},
                    size: 130,
                  ),
                  EasyPieChart(
                    key: const Key('pie 4'),
                    children: pies,
                    pieType: PieType.triCrust,
                    onTap: (index) {},
                    animateFromEnd: true,
                    borderWidth: 10,
                    size: 130,
                  ),
                ],
              ),
            ),
            const SizedBox(height: 30),
            CustomCard(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  EasyPieChart(
                    key: const Key('pie 5'),
                    children: pies,
                    pieType: PieType.fill,
                    onTap: (index) {},
                    start: 180,
                    size: 130,
                  ),
                  EasyPieChart(
                    key: const Key('pie 6'),
                    children: pies,
                    pieType: PieType.fill,
                    onTap: (index) {},
                    start: 180,
                    animateFromEnd: true,
                    size: 130,
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class CustomCard extends StatelessWidget {
  final Widget child;
  const CustomCard({Key? key, required this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(padding: const EdgeInsets.all(20.0), child: child),
    );
  }
}

贡献与问题反馈

  • 贡献方式:

    • 修复bug
    • 编写和改进文档。文档对我们非常重要,欢迎帮助我们添加多语言支持。
    • 开发者可以检查源码并提交pull request。
    • 查看 CONTRIBUTING.MD,了解提交bug、请求新功能、准备代码进行pull request等内容。
    • 请记得点赞、关注和给我们的仓库加星!
  • 遇到问题:

    • 如果遇到任何问题,请自由地打开 issue。
    • 如果觉得缺少某个特性,可以提出 feature request。也欢迎提交pull request。
  • 许可证:

    • 本插件遵循MIT License。

希望以上内容能帮助您更好地理解和使用 easy_pie_chart 插件!


更多关于Flutter饼状图绘制插件easy_pie_chart的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter饼状图绘制插件easy_pie_chart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用easy_pie_chart插件来绘制饼状图的示例代码。这个示例展示了如何配置和显示一个简单的饼状图。

首先,确保你已经在pubspec.yaml文件中添加了easy_pie_chart依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_pie_chart: ^2.4.3  # 请确保使用最新版本

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中创建一个饼状图。以下是一个完整的示例代码:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Pie Chart Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PieChartScreen(),
    );
  }
}

class PieChartScreen extends StatefulWidget {
  @override
  _PieChartScreenState createState() => _PieChartScreenState();
}

class _PieChartScreenState extends State<PieChartScreen> {
  // 定义饼状图数据
  final List<PieChartData> data = [
    PieChartData(
      color: Colors.red,
      value: 30,
      radius: 40,
      label: 'A',
      explodeOffset: 10,
    ),
    PieChartData(
      color: Colors.green,
      value: 25,
      radius: 40,
      label: 'B',
      explodeOffset: 5,
    ),
    PieChartData(
      color: Colors.blue,
      value: 20,
      radius: 40,
      label: 'C',
    ),
    PieChartData(
      color: Colors.yellow,
      value: 25,
      radius: 40,
      label: 'D',
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pie Chart Example'),
      ),
      body: Center(
        child: PieChart(
          data: data,
          animationDuration: Duration(milliseconds: 1000),
          animationType: PieChartAnimationType.expand,
          chartRadius: 200,
          centerHoleRadius: 70,
          ringStrokeWidth: 30,
          initialAngleInDegrees: 0,
          labelRadius: 100,
          labelTextStyle: TextStyle(fontSize: 16, color: Colors.black),
          showChartValues: true,
          showChartValuesOutside: false,
          chartValueBackgroundColor: Colors.grey[200]!,
          chartValueTextStyle: TextStyle(fontSize: 14, color: Colors.black),
          decimalPlaces: 1,
        ),
      ),
    );
  }
}

代码解释

  1. 依赖引入:

    • 在pubspec.yaml中添加了easy_pie_chart依赖。
  2. 主应用:

    • MyApp是一个无状态小部件,它创建了一个MaterialApp并设置了主页为PieChartScreen。
  3. 饼状图屏幕:

    • PieChartScreen是一个有状态小部件,它包含了饼状图的数据。
    • 数据定义在data列表中,每个PieChartData对象代表饼状图的一部分,包括颜色、值、半径、标签等。
  4. 构建饼状图:

    • 使用PieChart小部件来绘制饼状图,并传递数据和其他配置参数。
    • 参数包括动画持续时间、动画类型、图表半径、中心孔半径、环形描边宽度、初始角度、标签半径、标签文本样式、是否显示图表值等。

这样,你就可以在Flutter应用中显示一个配置好的饼状图了。根据需要,你可以调整这些参数来定制饼状图的外观和行为。

回到顶部