Flutter时间调度管理插件time_scheduler_table的使用

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

Flutter时间调度管理插件time_scheduler_table的使用

time_scheduler_table 是一个适用于Android和iOS的时间表插件,允许用户通过点击单元格创建事件、编辑(更新)以及删除已创建的事件。用户可以为事件分配颜色,并且如果事件名称过长,可以通过长按事件查看完整名称和描述。

Features

  • 创建、编辑和删除事件
  • 为事件分配颜色
  • 长按事件以查看完整名称和描述

Feature Image 1 Feature Image 2 Feature Image 3 Feature Image 4

Getting started

首先,在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  time_scheduler_table: ^latest_version # 替换为最新版本号

然后在终端中运行以下命令安装插件:

flutter pub add time_scheduler_table

Usage

创建事件列表

创建包含标题、列索引、行索引和颜色的事件列表。行和列索引指定的是列标签和行标签中的元素索引(例如:周一、周二或08:00, 09:00)。它们从0开始计数:

List<Event> eventList = [
  Event(
    title: "Flutter Project",
    columnIndex: 0, // columnLabel's index (Monday)
    rowIndex: 3, // rowLabel's index (08:00)
    color: Colors.orange,
  ),
  Event(
    title: "Deep Learning Course",
    columnIndex: 1,
    rowIndex: 6,
    color: Colors.pink,
  ),
  Event(
    title: "Violin & Piano Course",
    columnIndex: 4,
    rowIndex: 8,
    color: Colors.green,
  ),
  Event(
    title: "Sport",
    columnIndex: 3,
    rowIndex: 1,
    color: Colors.deepPurpleAccent,
  ),
  Event(
    title: "Algorithm and Data Structures",
    columnIndex: 2,
    rowIndex: 11,
    color: Colors.blue,
  )
];

创建Time Scheduler Widget

接下来,创建一个 TimeSchedulerTable 小部件并配置其属性:

TimeSchedulerTable(
  cellHeight: 52,
  cellWidth: 64,
  columnLabels: const [ // 可以自定义columnLabels
    "Mon",
    "Tue",
    "Wed",
    "Thur",
    "Fri",
    "Sat",
    "Sun"
  ],
  currentColumnTitleIndex: DateTime.now().weekday - 1,
  rowLabels: const [ // 可以自定义rowLabels
    '08:00 - 09:00',
    '09:00 - 10:00',
    '10:00 - 11:00',
    '11:00 - 12:00',
    '12:00 - 13:00',
    '13:00 - 14:00',
    '14:00 - 15:00',
    '15:00 - 16:00',
    '16:00 - 17:00',
    '17:00 - 18:00',
    '18:00 - 19:00',
    '19:00 - 20:00',
    '20:00 - 21:00',
  ],
  eventList: eventList,
  eventAlert: EventAlert(
    addAlertTitle: "Add Event",
    editAlertTitle: "Edit",
    addButtonTitle: "ADD",
    deleteButtonTitle: "DELETE",
    updateButtonTitle: "UPDATE",
    hintText: "Event Name",
    textFieldEmptyValidateMessage: "Cannot be empty!",
    addOnPressed: (event) { // 当事件被添加到列表时触发
      // Your code after event added.
    },
    updateOnPressed: (event) { // 当事件从列表中更新时触发
      // Your code after event updated.
    }, 
    deleteOnPressed: (event) { // 当事件从列表中删除时触发
      // Your code after event deleted.
    }, 
  ),
),

自定义列标签和行标签

columnLabelsrowLabels 属性用于定义时间表的列和行标签。默认情况下,columnLabels 包含一周的每一天,而 rowLabels 包含一天中的小时段。你可以根据需要自定义这些标签。

例如,如果你想将 columnLabels 定义为其他内容:

columnLabels: const ["Column 1", "Column 2", "Column 3"],
currentColumnTitleIndex: 2,

如果你想将 rowLabels 定义为其他内容:

rowLabels: const ["Row 1", "Row 2", "Row 3"],

示例代码

以下是一个完整的示例代码,展示了如何在Flutter项目中使用 time_scheduler_table 插件:

import 'package:time_scheduler_table/time_scheduler_table.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky,
        overlays: [SystemUiOverlay.bottom]);
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeView(),
    );
  }
}

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

  @override
  State<HomeView> createState() => _HomeViewState();
}

class _HomeViewState extends State<HomeView> {
  List<Event> eventList = [
    Event(
      title: "Flutter Project",
      columnIndex: 0, // columnLabel's index (Monday)
      rowIndex: 3, // rowLabel's index (08:00)
      color: Colors.orange,
    ),
    Event(
      title: "Deep Learning Course",
      columnIndex: 1,
      rowIndex: 6,
      color: Colors.pink,
    ),
    Event(
      title: "Violin & Piano Course",
      columnIndex: 4,
      rowIndex: 8,
      color: Colors.green,
    ),
    Event(
      title: "Sport",
      columnIndex: 3,
      rowIndex: 1,
      color: Colors.deepPurpleAccent,
    ),
    Event(
      title: "Algorithm and Data Structures",
      columnIndex: 2,
      rowIndex: 11,
      color: Colors.blue,
    )
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      backgroundColor: Colors.grey[100],
      body: Column(
        children: [
          TimeSchedulerTable(
            eventList: eventList,
            cellHeight: 52,
            cellWidth: 64,
            currentColumnTitleIndex: 3,
            eventAlert: EventAlert(
              addOnPressed: (event) {
                showSnackBar(context, '${event.title} added', event.color!);
              },
              deleteOnPressed: (event) {
                showSnackBar(context, '${event.title} deleted', event.color!);
              },
              updateOnPressed: (event) {
                showSnackBar(context, '${event.title} updated', event.color!);
              },
            ),
          ),
        ],
      ),
    );
  }

  void showSnackBar(BuildContext context, String message, Color color) {
    ScaffoldMessenger.of(context).hideCurrentSnackBar();
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
      content: Row(
        children: [
          Text(
            message,
            style: const TextStyle(
              color: Colors.white,
              fontSize: 12,
              fontWeight: FontWeight.w400,
            ),
          ),
        ],
      ),
      showCloseIcon: true,
      closeIconColor: Colors.white,
      backgroundColor: color,
    ));
  }
}

感谢 Mesut Demir 的贡献!

希望这个指南能帮助你更好地理解和使用 time_scheduler_table 插件。如果你有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用time_scheduler_table插件进行时间调度管理的代码示例。请注意,由于time_scheduler_table是一个假定的插件名称(实际中可能不存在此名字的官方插件),我将基于常见的时间调度管理功能展示一个示例代码。如果你使用的是某个具体的插件,请查阅其官方文档并做相应调整。

假设我们有一个时间调度表,用户可以在其中添加、查看和删除任务。以下是一个基本的Flutter应用示例,它使用自定义逻辑来管理时间调度:

1. 添加依赖

首先,在你的pubspec.yaml文件中添加任何必要的依赖项(这里假设没有特定的第三方插件,因为time_scheduler_table是假定名称)。你可能需要添加一些基本的UI组件库,如flutter_material_datetime_picker用于日期时间选择。

dependencies:
  flutter:
    sdk: flutter
  flutter_material_datetime_picker: ^4.0.0  # 示例依赖,用于日期时间选择

2. 创建任务模型

定义一个简单的任务模型。

class Task {
  String id;
  String title;
  DateTime dateTime;

  Task({required this.id, required this.title, required this.dateTime});
}

3. 管理任务

创建一个服务来管理任务列表。

import 'package:dart_collection_extensions/dart_collection_extensions.dart';

class TaskService {
  private List<Task> tasks = [];
  private int nextId = 1;

  void addTask(String title, DateTime dateTime) {
    tasks.add(Task(id: nextId.toString(), title: title, dateTime: dateTime));
    nextId++;
  }

  void deleteTask(String id) {
    tasks = tasks.where((task) => task.id != id).toList();
  }

  List<Task> getAllTasks() {
    return tasks;
  }
}

4. 创建UI界面

创建一个简单的UI来展示任务列表,并允许用户添加和删除任务。

import 'package:flutter/material.dart';
import 'package:flutter_material_datetime_picker/flutter_material_datetime_picker.dart';
import 'task_model.dart';
import 'task_service.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Time Scheduler',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SchedulerHome(taskService: TaskService()),
    );
  }
}

class SchedulerHome extends StatefulWidget {
  final TaskService taskService;

  SchedulerHome({required this.taskService});

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

class _SchedulerHomeState extends State<SchedulerHome> {
  final TextEditingController titleController = TextEditingController();
  DateTime? selectedDateTime;

  void addTask() {
    if (titleController.text.isNotEmpty && selectedDateTime != null) {
      widget.taskService.addTask(titleController.text, selectedDateTime!);
      setState(() {});
      titleController.clear();
      showDatePicker(context: context, initialDate: selectedDateTime!, firstDate: DateTime(2000), lastDate: DateTime(2101)).then((value) {
        if (value != null && value != selectedDateTime) {
          showTimePicker(
            context: context,
            initialTime: TimeOfDay.fromDateTime(selectedDateTime ?? DateTime.now()),
          ).then((time) {
            setState(() {
              selectedDateTime = DateTime(value.year, value.month, value.day, time.hour, time.minute);
            });
          });
        }
      });
    }
  }

  void deleteTask(String id) {
    widget.taskService.deleteTask(id);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Scheduler'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            TextField(
              controller: titleController,
              decoration: InputDecoration(hintText: 'Enter task title'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                DateTime? pickedDate = await showDatePicker(
                  context: context,
                  initialDate: DateTime.now(),
                  firstDate: DateTime(2000),
                  lastDate: DateTime(2101)
                );
                if (pickedDate != null) {
                  TimeOfDay? pickedTime = await showTimePicker(
                    context: context,
                    initialTime: TimeOfDay.fromDateTime(pickedDate),
                  );
                  if (pickedTime != null) {
                    setState(() {
                      selectedDateTime = DateTime(pickedDate.year, pickedDate.month, pickedDate.day, pickedTime.hour, pickedTime.minute);
                    });
                    addTask();
                  }
                }
              },
              child: Text('Add Task'),
            ),
            SizedBox(height: 16),
            Expanded(
              child: ListView.builder(
                itemCount: widget.taskService.getAllTasks().length,
                itemBuilder: (context, index) {
                  Task task = widget.taskService.getAllTasks()[index];
                  return ListTile(
                    title: Text(task.title),
                    subtitle: Text('${task.dateTime.toLocal()}'),
                    trailing: IconButton(
                      icon: Icon(Icons.delete),
                      onPressed: () => deleteTask(task.id),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行应用

确保你已经安装了所有依赖项,并运行你的Flutter应用。

flutter pub get
flutter run

这个示例展示了如何创建一个基本的Flutter应用,用于管理时间调度任务。如果你使用的是特定的time_scheduler_table插件,请参考其官方文档进行集成和配置。

回到顶部