Flutter时间规划插件time_planner的使用

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

Flutter时间规划插件time_planner的使用

Time Planner 是一个美观、易于使用且可定制的时间规划插件,适用于 Flutter 的移动、桌面和 Web 平台。它可以帮助用户在时间表上展示任务。

截图

Mobile Dark
Mobile Dark
Desktop Web
Desktop Web

在线演示

您可以在这里查看在线演示:Web Demo

使用方法

1. 添加依赖到 pubspec.yaml 文件中

dependencies:
  time_planner: ^0.1.2+1

2. 导入 time_planner

import 'package:time_planner/time_planner.dart';

3. 使用 TimePlanner

List<TimePlannerTask> tasks = [
  TimePlannerTask(
    color: Colors.purple,
    dateTime: TimePlannerDateTime(day: 0, hour: 14, minutes: 30),
    minutesDuration: 90,
    daysDuration: 1,
    onTap: () {},
    child: Text(
      'this is a task',
      style: TextStyle(color: Colors.grey[350], fontSize: 12),
    ),
  ),
];

TimePlanner(
  startHour: 6,
  endHour: 23,
  headers: [
    TimePlannerTitle(
      date: "3/10/2021",
      title: "sunday",
    ),
    TimePlannerTitle(
      date: "3/11/2021",
      title: "monday",
    ),
    TimePlannerTitle(
      date: "3/12/2021",
      title: "tuesday",
    ),
  ],
  tasks: tasks,
)

多天任务

您可以使用 daysDuration 来创建多天任务:

TimePlannerTask(
  color: Colors.blue,
  dateTime: TimePlannerDateTime(day: 0, hour: 14, minutes: 30),
  minutesDuration: 180,
  daysDuration: 3,
  onTap: () {},
  child: Text(
    'Multi-day task',
    style: TextStyle(color: Colors.white, fontSize: 12),
  ),
),

样式自定义

您可以使用 TimePlannerStyle 来自定义样式:

style: TimePlannerStyle(
  backgroundColor: Colors.blueGrey[900],
  cellHeight: 60,
  cellWidth: 60,
  dividerColor: Colors.white,
  showScrollBar: true,
  horizontalTaskPadding: 5,
  borderRadius: const BorderRadius.all(Radius.circular(8)),
),

滚动行为设置

如果您希望在桌面或 Web 平台上允许鼠标拖动,请添加以下代码:

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
  };
}

MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);

完整示例

以下是一个完整的示例,包含随机生成任务的功能:

import 'dart:math';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:time_planner/time_planner.dart';

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

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
  };
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Time planner Demo',
      scrollBehavior: MyCustomScrollBehavior(),
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(title: 'Time planner'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<TimePlannerTask> tasks = [];

  void _addObject(BuildContext context) {
    List<Color?> colors = [
      Colors.purple,
      Colors.blue,
      Colors.green,
      Colors.orange,
      Colors.lime[600]
    ];

    setState(() {
      tasks.add(
        TimePlannerTask(
          color: colors[Random().nextInt(colors.length)],
          dateTime: TimePlannerDateTime(
              day: Random().nextInt(14),
              hour: Random().nextInt(18) + 6,
              minutes: Random().nextInt(60)),
          minutesDuration: Random().nextInt(90) + 30,
          daysDuration: Random().nextInt(4) + 1,
          onTap: () {
            ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
                content: Text('You click on time planner object')));
          },
          child: Text(
            'this is a demo',
            style: TextStyle(color: Colors.grey[350], fontSize: 12),
          ),
        ),
      );
    });

    ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('Random task added to time planner!')));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        centerTitle: true,
      ),
      body: Center(
        child: TimePlanner(
          startHour: 6,
          endHour: 23,
          use24HourFormat: false,
          setTimeOnAxis: false,
          style: TimePlannerStyle(
            showScrollBar: true,
            interstitialEvenColor: Colors.grey[50],
            interstitialOddColor: Colors.grey[200],
          ),
          headers: const [
            TimePlannerTitle(date: "3/10/2021", title: "sunday"),
            TimePlannerTitle(date: "3/11/2021", title: "monday"),
            TimePlannerTitle(date: "3/12/2021", title: "tuesday"),
            // ... 其他日期标题
          ],
          tasks: tasks,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => _addObject(context),
        tooltip: 'Add random task',
        child: const Icon(Icons.add),
      ),
    );
  }
}

通过以上步骤,您可以在 Flutter 应用中轻松集成并使用 time_planner 插件来管理您的时间规划需求。


更多关于Flutter时间规划插件time_planner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter时间规划插件time_planner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用time_planner插件的简单示例代码。请注意,实际使用时可能需要根据插件的最新版本和文档进行调整。由于time_planner并不是Flutter官方或广泛知名的插件,以下示例假设该插件提供了基本的时间规划功能,并且已经正确安装和配置在你的Flutter项目中。

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

dependencies:
  flutter:
    sdk: flutter
  time_planner: ^latest_version  # 替换为实际的最新版本号

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

接下来是一个简单的Flutter应用示例,展示如何使用time_planner插件来创建一个时间规划界面:

import 'package:flutter/material.dart';
import 'package:time_planner/time_planner.dart';  // 假设插件提供了这样的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Time Planner Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TimePlannerScreen(),
    );
  }
}

class TimePlannerScreen extends StatefulWidget {
  @override
  _TimePlannerScreenState createState() => _TimePlannerScreenState();
}

class _TimePlannerScreenState extends State<TimePlannerScreen> {
  // 假设TimePlannerController是插件提供的控制器类
  TimePlannerController? _controller;

  @override
  void initState() {
    super.initState();
    // 初始化控制器
    _controller = TimePlannerController(
      // 根据插件文档配置初始化参数
      startTime: DateTime.now().startOfDay,
      endTime: DateTime.now().startOfDay.add(Duration(days: 1)),
      intervalDuration: Duration(hours: 1), // 例如,每小时一个间隔
    );
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Planner Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: _controller != null
            ? TimePlanner(
                controller: _controller!,
                // 假设TimePlannerWidget是插件提供的主要小部件
                builder: (context, timeSlot) {
                  // 自定义每个时间槽的显示
                  return Card(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        '${timeSlot.startTime.toLocal().hour}:${timeSlot.startTime.toLocal().minute:02}-${timeSlot.endTime.toLocal().hour}:${timeSlot.endTime.toLocal().minute:02}',
                        style: TextStyle(fontSize: 18),
                      ),
                    ),
                  );
                },
              )
            : Center(child: CircularProgressIndicator()),
      ),
    );
  }
}

在这个示例中,我们假设time_planner插件提供了TimePlannerControllerTimePlanner小部件。TimePlannerController用于配置时间规划的开始时间、结束时间和时间间隔等参数,而TimePlanner小部件则用于渲染时间规划界面。

请注意,由于time_planner插件的具体API和实现细节可能与我假设的不同,因此你需要参考插件的官方文档来正确配置和使用它。如果插件提供了示例代码或文档,那么遵循那些指导将是最准确的方法。

回到顶部