Flutter交互式甘特图插件interactive_gantt_chart的使用

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

Flutter交互式甘特图插件interactive_gantt_chart的使用

简介

interactive_gantt_chart 是一个用于创建交互式甘特图的Flutter包。此包允许您可视化和与甘特图进行交互,包括滚动、拖动、调整大小以及动态更新数据等功能。

Gantt Chart Example

特性

  • 显示带有开始和结束日期的数据
  • 支持作为项目中任务的子数据
  • 可滚动、可拖动和可调整大小的数据
  • 动态粘贴日期标签
  • 自定义任务标签和样式
  • 提供一些自定义构建器

使用方法

要使用这个包,请按照以下步骤操作:

  1. pubspec.yaml 文件中添加包:
dependencies:
  interactive_gantt_chart: ^0.1.1
  1. 在 Dart 文件中导入包:
import 'package:interactive_gantt_chart/interactive_gantt_chart.dart';
  1. 创建数据模型并将其转换为 GanttDataGanttSubData 并初始化甘特图:
// 定义任务类
class Task {
  String name;
  DateTime start;
  DateTime end;

  Task({required this.name, required this.start, required this.end});
}

List<GanttData<Task, String>> ganttData = [
  GanttData<Task, String>(
    dateStart: DateTime(2023, 1, 1),
    dateEnd: DateTime(2023, 1, 10),
    data: Task(name: 'Task 1', start: DateTime(2023, 1, 1), end: DateTime(2023, 1, 10)),
    label: 'Task 1',
    subData: [
      GanttSubData(
        dateStart: DateTime(2023, 1, 2),
        dateEnd: DateTime(2023, 1, 5),
        data: 'Sub Task 1',
        label: 'Sub Task 1',
      ),
    ],
  ),
];

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    body: SafeArea(
      child: GanttChart<Task, String>(
        data: ganttData,
        onDragEnd: (data, index, details) {
          // 更新拖动后的数据
          ganttData[index] = data;
        },
      ),
    ),
  );
}
  1. 根据需要使用可用属性和构建器自定义甘特图。

示例代码

以下是完整的示例代码,展示如何使用 interactive_gantt_chart 包:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class DummyData {
  static List<Task> data = [
    Task(name: 'Task 1', start: DateTime(2023, 1, 1), end: DateTime(2023, 1, 10)),
    Task(name: 'Task 2', start: DateTime(2023, 1, 5), end: DateTime(2023, 1, 15)),
  ];
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<GanttData<Task, String>> ganttData = DummyData.data.map((task) {
    return GanttData<Task, String>(
      dateStart: task.start,
      dateEnd: task.end,
      data: task,
      label: task.name,
      subData: [
        GanttSubData(
          id: GanttSubData.generateId(),
          dateStart: task.start.add(const Duration(days: 1)),
          dateEnd: task.end,
          data: 'Sub ${task.name}',
          label: 'Sub ${task.name} 1',
        ),
        GanttSubData(
          id: GanttSubData.generateId(),
          dateStart: task.start.add(const Duration(days: 1)),
          dateEnd: task.end,
          data: 'Sub ${task.name}',
          label: 'Sub ${task.name} 2',
        ),
      ],
    );
  }).toList();

  [@override](/user/override)
  void initState() {
    final firstData = ganttData.first;
    firstData.subData.add(
      GanttSubData<String>(
        id: GanttSubData.generateId(),
        dateStart: ganttData[0].data.start,
        dateEnd: ganttData[0].data.end,
        data: ganttData[0].label,
        label: ganttData[0].data.name,
      ),
    );
    firstData.subData.add(
      GanttSubData<String>(
        id: GanttSubData.generateId(),
        dateStart: ganttData[0].data.start,
        dateEnd: ganttData[0].data.end,
        data: ganttData[0].label,
        label: ganttData[0].data.name,
      ),
    );
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            children: [
              const Text('Hello, Gantt!'),
              Expanded(
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: GanttChart<Task, String>(
                    onReordered: (orderedIndex, newIndex) {
                      // 不要手动重新排序数据!
                      // 数据的重新排序已由包处理,如果手动重新排序可能会导致一些奇怪的行为
                    },
                    connectorColor: Colors.deepPurple,
                    gridLineColor: Colors.grey,
                    tableOuterColor: Colors.grey,
                    dayLabelStyle: const TextStyle(
                      fontSize: 14,
                      fontWeight: FontWeight.bold,
                    ),
                    taskLabelBuilder: (textLabel, index) {
                      return Container(
                        alignment: Alignment.center,
                        child: Text(textLabel),
                      );
                    },
                    onInitScrollToCurrentDate: true,
                    data: ganttData,
                    onDragEnd: (data, index, _) {
                      ganttData[index] = data;
                    },
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter交互式甘特图插件interactive_gantt_chart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter交互式甘特图插件interactive_gantt_chart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter交互式甘特图插件interactive_gantt_chart的示例代码。这个示例展示了如何创建一个基本的甘特图,并添加一些任务。

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

dependencies:
  flutter:
    sdk: flutter
  interactive_gantt_chart: ^最新版本号 # 请替换为实际可用的最新版本号

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

接下来,在你的Flutter项目中创建一个甘特图。以下是一个完整的示例代码:

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

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

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

class GanttChartScreen extends StatefulWidget {
  @override
  _GanttChartScreenState createState() => _GanttChartScreenState();
}

class _GanttChartScreenState extends State<GanttChartScreen> {
  // 示例任务数据
  final List<GanttChartTask> tasks = [
    GanttChartTask(
      id: 'task1',
      label: 'Task 1',
      startDate: DateTime(2023, 10, 1),
      endDate: DateTime(2023, 10, 5),
      progress: 0.3,
      dependencies: [],
    ),
    GanttChartTask(
      id: 'task2',
      label: 'Task 2',
      startDate: DateTime(2023, 10, 3),
      endDate: DateTime(2023, 10, 8),
      progress: 0.7,
      dependencies: ['task1'],
    ),
    GanttChartTask(
      id: 'task3',
      label: 'Task 3',
      startDate: DateTime(2023, 10, 10),
      endDate: DateTime(2023, 10, 15),
      progress: 0.5,
      dependencies: ['task2'],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Gantt Chart Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: InteractiveGanttChart(
          tasks: tasks,
          viewStartDate: DateTime(2023, 10, 1),
          viewEndDate: DateTime(2023, 10, 31),
          onTaskClick: (task) {
            // 点击任务时的回调处理
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('Clicked on ${task.label}'),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个甘特图。甘特图由三个任务组成,每个任务都有不同的开始日期、结束日期和进度。我们还添加了一个点击任务的回调,当用户点击某个任务时,会显示一个SnackBar。

请注意,interactive_gantt_chart插件的具体API和用法可能会随着版本的更新而变化,因此请参考插件的官方文档和示例代码以获取最新和详细的用法信息。

希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。

回到顶部