Flutter日程管理插件flutter_hourly_calendar的使用
Flutter日程管理插件flutter_hourly_calendar的使用
Flutter hourly calendar。可以根据选定的时间段可视化您的事件。
截图
图片1 | 图片2 |
---|---|
![]() |
![]() |
图片3 | 图片4 |
---|---|
![]() |
![]() |
使用
示例代码
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');
},
),