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

发布于 1周前 作者 yibo5220 来自 Flutter

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应用中显示一个配置好的饼状图了。根据需要,你可以调整这些参数来定制饼状图的外观和行为。

回到顶部