Flutter日程管理插件flutter_hourly_calendar的使用

Flutter日程管理插件flutter_hourly_calendar的使用

Flutter hourly calendar。可以根据选定的时间段可视化您的事件。

截图

图片1 图片2
poc poc
图片3 图片4
poc poc

使用

示例代码

HourlyCalendar(
  controller: controller,
  onSelected: (selectedItem, controller) {
    print("${selectedItem.startTime} - ${selectedItem.endTime}");
  },
),

初始化数据

var random = math.Random();
late var items = List.generate(20, (index) {
  return CalendarData<String>(
      title: "Event $index",
      id: "$index",
      startTime: DateTime.now().add(const Duration(days: -5)).add(Duration(days: index)).copyWith(
            hour: random.nextInt(20) - 10,
            minute: random.nextInt(59),
          ),
      endTime: DateTime.now().add(const Duration(days: -5)).add(Duration(days: index)).copyWith(
            hour: random.nextInt(23) + 12,
            minute: random.nextInt(59),
          ),
      data: "event $index",
      color: Color((math.Random().nextDouble() * 0xFFFFFF).toInt()).withOpacity(1.0));
});
late final HourlyCalendarController controller = HourlyCalendarController(items, date: DateTime.now());

参数

HourlyCalendarController

参数说明

  • List<CalendarData<T>> items, {this.oneHourHeight = 40, DateTime? date}
    • items: 您的事件。类型为 List<CalendarData<T>>
    • oneHourHeight: 1小时的总高度。所有计算都基于此值
  • date: 选择的日历日期,默认为 DateTime.now()

示例代码

double _findHeight(DateTime start, DateTime end) {
  // 每秒的高度
  var perSecondHeight = controller.oneHourHeight / 3600;

  var diff = start.difference(end);
  // 总事件秒数
  var totalSecond = diff.inSeconds;
  // 总事件高度
  return (totalSecond * perSecondHeight).toDouble().abs();
}

HourlyCalendar

参数说明

  • controller [HourlyCalendarController] 日历控制器。必须在控制器中指定您的事件
  • mainContainerDecoration - [BoxDecoration] 主容器装饰
  • hourContainerDecoration - [BoxDecoration] 每小时容器装饰
  • hourTextStyle - [TextStyle] 每小时文本样式
  • bottomListTitleStyle - [TextStyle] 底部列表标题文本样式
  • bottomListHourStyle - [TextStyle] 底部列表持续时间文本样式
  • controller - [HourlyCalendarController] 日历控制器
  • hideHeader - [bool] 如果为 true 隐藏头部
  • hideFooter - [bool] 如果为 true 隐藏底部
  • headerHeight - [double] 头部高度
  • hoursWidth - [double] 小时宽度
  • headerDateTextStyle - [TextStyle] 头部文本样式
  • headerDateFormat - [String] 头部日期文本格式
  • hourBuilder - 构建每个小时

示例代码

(hourBuilder)
(context,hour) =>  Container(
    padding: const EdgeInsets.all(8),
    decoration: hourContainerDecoration ??
        BoxDecoration(
          border: Border(
            right: BorderSide(color: Theme.of(context).disabledColor.withOpacity(0.5)),
          ),
        ),
    child: Center(
      child: Text(
        hour.text,
        style: hourTextStyle ??
            Theme.of(context).textTheme.bodyLarge!.copyWith(
                  fontSize: 15,
                  color: hour.isShift
                      ? Theme.of(context).disabledColor.withOpacity(0.3)
                      : Theme.of(context).disabledColor,
                ),
      ),
    ),
  )

itemBuilder -> 构建每个事件

(itemBuilder)
(context,item,controller,selectedId) => InkWell(
     onLongPress: () {
       controller.setSelected(item.id);
       if (onSelected != null) {
         onSelected!(item, controller);
       }
     },
     onTap: () => controller.setSelected(item.id),
     child: Container(
       // width: 100,
       height: mainContainerHeight,
       decoration: BoxDecoration(
         color: selectedId == item.id ? item.color : item.color.withAlpha(150),
         borderRadius: BorderRadius.circular(5),
       ),
       child: Center(
         child: RotatedBox(
           quarterTurns: 1,
           child: FittedBox(
             child: Text(
               item.title,
               style: hourTextStyle ??
                   Theme.of(context).textTheme.bodyLarge!.copyWith(
                         fontSize: 15,
                         color: Colors.white,
                       ),
             ),
           ),
         ),
       ),
     ),
   );

bottomItemListBuilder -> 构建底部事件列表

(bottomItemListBuilder)
(context,item,controller,selectedId)=>Row(children:[
   Text(item.startTime),
   Text(item.endTime),
  ])

其他参数

  • onSelected - 点击事件 (selectedItem,controller) => void
  • onRefresh - 刷新事件 () => void
  • headerBuilder - 头部构建器

示例代码

(headerBuilder)
(date,controller)=>Row(
     children:[
     Button(onPress:controller.previousDate,text:'Previous'),
     Expanded(child: Text(date.toString().format("HH:mm")),)
     Button(onPress:controller.nextDate,text:'Next')
   ])

完整示例代码

import 'package:flutter/material.dart';
import 'package:flutter_hourly_calendar/flutter_hourly_calendar.dart';
import "dart:math" as math;

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

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  var random = math.Random();
  late var items = List.generate(20, (index) {
    return CalendarData<String>(
        title: "Event $index",
        id: "$index",
        startTime: DateTime.now().add(const Duration(days: -5)).add(Duration(days: index)).copyWith(
              hour: random.nextInt(20) - 10,
              minute: random.nextInt(59),
            ),
        endTime: DateTime.now().add(const Duration(days: -5)).add(Duration(days: index)).copyWith(
              hour: random.nextInt(23) + 12,
              minute: random.nextInt(59),
            ),
        data: "event $index",
        color: Color((math.Random().nextDouble() * 0xFFFFFF).toInt()).withOpacity(1.0));
  });
  late final HourlyCalendarController controller = HourlyCalendarController(items, date: DateTime.now(), oneHourHeight: 60);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: HourlyCalendar(
          controller: controller,
          onSelected: (selectedItem, controller) {
            print("${selectedItem.startTime} - ${selectedItem.endTime}");
          },
        ),
      ),
    );
  }
}

更多关于Flutter日程管理插件flutter_hourly_calendar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


flutter_hourly_calendar 是一个用于在 Flutter 应用中显示和管理小时级日程的插件。它允许你以小时为单位查看和编辑日程,非常适合需要精确时间管理的应用场景。

安装

首先,你需要在 pubspec.yaml 文件中添加 flutter_hourly_calendar 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_hourly_calendar: ^0.1.0  # 请使用最新版本

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

基本用法

1. 导入包

import 'package:flutter_hourly_calendar/flutter_hourly_calendar.dart';

2. 创建日程事件

你可以创建一个 HourlyEvent 对象来表示一个日程事件。每个事件都有一个开始时间、结束时间和一些附加信息。

HourlyEvent event = HourlyEvent(
  startTime: DateTime(2023, 10, 1, 9, 0), // 开始时间
  endTime: DateTime(2023, 10, 1, 10, 0), // 结束时间
  title: '会议', // 事件标题
  description: '项目讨论', // 事件描述
  color: Colors.blue, // 事件颜色
);

3. 使用 HourlyCalendar

你可以在你的应用中使用 HourlyCalendar 组件来显示和管理日程事件。

class MyHomePage extends StatelessWidget {
  final List<HourlyEvent> events = [
    HourlyEvent(
      startTime: DateTime(2023, 10, 1, 9, 0),
      endTime: DateTime(2023, 10, 1, 10, 0),
      title: '会议',
      description: '项目讨论',
      color: Colors.blue,
    ),
    // 添加更多事件...
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('小时级日程管理'),
      ),
      body: HourlyCalendar(
        events: events,
        onEventTap: (event) {
          // 处理事件点击
          print('事件被点击: ${event.title}');
        },
        onTimeSlotTap: (time) {
          // 处理时间槽点击
          print('时间槽被点击: $time');
        },
        onEventCreate: (startTime, endTime) {
          // 处理新事件创建
          print('新事件创建: $startTime - $endTime');
        },
      ),
    );
  }
}

主要功能

  • 显示小时级日程HourlyCalendar 会以小时为单位显示日程事件。
  • 事件点击:通过 onEventTap 回调处理事件点击。
  • 时间槽点击:通过 onTimeSlotTap 回调处理时间槽点击。
  • 创建新事件:通过 onEventCreate 回调处理新事件的创建。

自定义

你可以通过 HourlyCalendar 的属性来自定义日历的外观和行为,例如:

  • startHour:设置日历的起始小时。
  • endHour:设置日历的结束小时。
  • eventHeight:设置事件的高度。
  • timeSlotHeight:设置时间槽的高度。
HourlyCalendar(
  startHour: 8,
  endHour: 20,
  eventHeight: 50,
  timeSlotHeight: 60,
  events: events,
  onEventTap: (event) {
    print('事件被点击: ${event.title}');
  },
  onTimeSlotTap: (time) {
    print('时间槽被点击: $time');
  },
  onEventCreate: (startTime, endTime) {
    print('新事件创建: $startTime - $endTime');
  },
),
回到顶部