Flutter日历日程管理插件calendar_day_slot_navigator的使用
Flutter日历日程管理插件 calendar_day_slot_navigator
的使用
概述
calendar_day_slot_navigator
是一个功能强大且高度可定制的Flutter日历小部件,使日期选择变得美观和直观。无论是构建预订应用、调度系统还是任何需要优雅日期选择的应用程序,它都提供了所需的灵活性和功能。
特性
主题支持
- 无缝集成浅色和深色模式
- 完全控制颜色和渐变
- 自定义活动和非活动状态
高级自定义
- 所有元素的灵活圆角半径
- 自定义标题文本和样式
- 可调的日框尺寸和边框
- 支持自定义字体,包括Google字体
强大的选择选项
- 单个日期选择
- 日期范围选择
- 自定义活动/非活动日期范围
- 多种日历布局选项
灵活的显示模式
- 盒子内日期显示
- 盒子外日期显示
- 不同视图大小的可调槽长
快速开始
安装
在您的pubspec.yaml
中添加calendar_day_slot_navigator
:
dependencies:
calendar_day_slot_navigator: ^0.0.1
运行以下命令安装包:
flutter pub get
导入
在您的Dart文件中导入包:
import 'package:calendar_day_slot_navigator/calendar_day_slot_navigator.dart';
使用示例
基本实现
下面是一个简单的示例,帮助您快速上手:
CalendarDaySlotNavigator(
slotLength: 5,
dayDisplayMode: DayDisplayMode.outsideDateBox,
headerText: "Select Date",
onDateSelect: (selectedDate) {
print("Selected date: $selectedDate");
},
)
自定义样式
添加漂亮的渐变和自定义样式:
CalendarDaySlotNavigator(
slotLength: 7,
dayBoxHeightAspectRatio: 8,
dayDisplayMode: DayDisplayMode.insideDateBox,
isGradientColor: true,
activeGradientColor: LinearGradient(
colors: [
Color(0xffb644ae),
Color(0xff873999),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
monthYearTabBorderRadius: 15,
dayBoxBorderRadius: 10,
headerText: "Select Your Preferred Date",
fontFamilyName: "Roboto",
isGoogleFont: true,
dayBorderWidth: 0.5,
onDateSelect: (selectedDate) {
print("Selected date: $selectedDate");
},
)
日期范围选择
实现具有特定活动日期的日期范围选择:
CalendarDaySlotNavigator(
dateSelectionType: DateSelectionType.activeRangeDates,
rangeDates: [
DateTime(2024, 6, 1),
DateTime(2024, 6, 2),
DateTime(2024, 6, 3),
DateTime(2024, 6, 4),
DateTime(2024, 6, 5),
],
onDateSelect: (selectedDate) {
print("Selected date within range: $selectedDate");
},
)
属性指南
基本属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
slotLength | int? |
7 | 决定每行显示多少天。适用于不同的屏幕尺寸和布局。 |
dayBoxHeightAspectRatio | double? |
6.0 | 控制日框的高度相对于宽度的比例。较高的值使盒子更短。 |
dayDisplayMode | DayDisplayMode |
outsideDateBox | 确定日期框中的日期名称出现的位置。选择outsideDateBox 或insideDateBox 。 |
样式属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
activeColor | Color? |
主题主色 | 已选日期的背景颜色 |
deActiveColor | Color? |
白色 | 未选日期的背景颜色 |
isGradientColor | bool? |
false | 启用日期的渐变背景 |
activeGradientColor | LinearGradient? |
null | 自定义已选日期的渐变 |
deActiveGradientColor | LinearGradient? |
null | 自定义未选日期的渐变 |
monthYearTabBorderRadius | double? |
10.0 | 月/年选择标签的圆角半径 |
dayBoxBorderRadius | double? |
8.0 | 单个日期框的圆角半径 |
dayBorderWidth | double? |
1.0 | 日期框边框的宽度 |
字体属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
fontFamilyName | String? |
系统字体 | 要使用的字体族名称 |
isGoogleFont | bool? |
false | 当使用Google字体时设置为true |
选择属性
属性 | 类型 | 描述 |
---|---|---|
dateSelectionType | DateSelectionType |
控制哪些日期可以被选择 |
rangeDates | List<DateTime>? |
对于基于范围的选择类型,列出的日期 |
onDateSelect | Function(DateTime)? |
日期被选中时的回调函数 |
显示模式
外部日期框模式
dayDisplayMode: DayDisplayMode.outsideDateBox
- 日期名称出现在日期框上方
- 提供干净、分离的外观
- 更多空间用于日期数字
内部日期框模式
dayDisplayMode: DayDisplayMode.insideDateBox
- 日期名称出现在日期框内部
- 更紧凑的布局
- 适合空间有限的设计
示例代码
完整的示例代码如下:
import 'package:calendar_day_slot_navigator/calendar_day_slot_navigator.dart';
import 'package:flutter/material.dart';
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(title: 'Calendar'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
DateTime varSelectedDate = DateTime.now();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xffffffff),
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: CalendarDaySlotNavigator(
slotLength: 6, // 每次显示多少天
dayBoxHeightAspectRatio: 5, // 设置动态高度的日框
dayDisplayMode: DayDisplayMode.outsideDateBox, // 两种设计变体:DayDisplayMode.outsideDateBox 和 DayDisplayMode.inDateBox
activeColor: const Color(0xffb644ae), // 设置已选日期的背景颜色
deActiveColor: const Color(0xffffffff), // 设置未选日期的背景颜色
monthYearTabBorderRadius: 15, // 调整月和年标签的圆角半径
dayBoxBorderRadius: 10, // 设置日框的圆角半径
headerText: "Select Date", // 自定义此小部件的标题文本
onDateSelect: (selectedDate) {}, // 获取用户点击的选定日期
dateSelectionType: DateSelectionType.deActiveRangeDates, // 设置启用和禁用日期的场景
rangeDates: [
// 添加日期范围以用于dateSelectionType场景
DateTime(2024, 6, 9), DateTime(2024, 6, 6), DateTime(2024, 6, 8),
],
fontFamilyName: "Lato", // 设置自定义字体或Google字体名称
isGoogleFont: true, // 设置为true以使用Google字体
dayBorderWidth: 0.5, // 设置日框边框宽度
),
);
}
}
更多关于Flutter日历日程管理插件calendar_day_slot_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter日历日程管理插件calendar_day_slot_navigator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用calendar_day_slot_navigator
插件的示例代码。这个插件通常用于创建带有时间槽的日历视图,适用于日程管理应用。
首先,确保你已经将calendar_day_slot_navigator
添加到你的pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
calendar_day_slot_navigator: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来,我们将编写一个简单的示例,展示如何使用calendar_day_slot_navigator
来创建一个基本的日程管理界面。
示例代码
main.dart
import 'package:flutter/material.dart';
import 'package:calendar_day_slot_navigator/calendar_day_slot_navigator.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CalendarProvider()),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Calendar Day Slot Navigator Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CalendarScreen(),
);
}
}
class CalendarScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final calendarProvider = Provider.of<CalendarProvider>(context);
return Scaffold(
appBar: AppBar(
title: Text('Calendar Day Slot Navigator'),
),
body: CalendarDaySlotNavigator(
initialDate: DateTime.now(),
timeSlots: List.generate(
24,
(index) => DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, index),
),
onDaySelected: (date) {
calendarProvider.selectedDate = date;
},
onEventPressed: (event) {
// Handle event press
},
onEventAdded: (event) {
calendarProvider.addEvent(event);
},
builder: (context, state) {
return Column(
children: [
Expanded(
child: DaySlotView(
date: state.currentDate,
events: calendarProvider.eventsForDate(state.currentDate),
timeSlots: state.timeSlots,
),
),
// You can add more widgets here, e.g., an event creation form
],
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Show a dialog or bottom sheet to add a new event
showEventCreationDialog(context, calendarProvider);
},
tooltip: 'Add Event',
child: Icon(Icons.add),
),
);
}
}
class CalendarProvider with ChangeNotifier {
DateTime selectedDate = DateTime.now();
final List<Event> _events = [];
void addEvent(Event event) {
_events.add(event);
notifyListeners();
}
List<Event> eventsForDate(DateTime date) {
return _events.where((event) => event.date == date).toList();
}
}
class Event {
final DateTime date;
final String title;
Event(this.date, this.title);
}
void showEventCreationDialog(BuildContext context, CalendarProvider calendarProvider) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Add Event'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
decoration: InputDecoration(labelText: 'Title'),
onSubmitted: (title) {
final now = DateTime.now();
final event = Event(now, title);
calendarProvider.addEvent(event);
Navigator.of(context).pop();
},
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Cancel'),
),
],
),
);
}
解释
- 依赖注入: 使用
provider
包来管理CalendarProvider
的状态。 - CalendarProvider: 管理当前选择的日期和事件列表。
- CalendarScreen: 主要的UI组件,包含
CalendarDaySlotNavigator
和浮动操作按钮来添加新事件。 - Event: 简单的数据模型,包含日期和标题。
- showEventCreationDialog: 显示一个对话框来添加新事件。
注意事项
- 请确保在实际项目中处理更多的边界情况和错误处理。
- 根据需求自定义UI和交互。
- 插件的版本可能会更新,请查阅最新的文档和示例代码。
这个示例展示了如何使用calendar_day_slot_navigator
插件来创建一个基本的日历日程管理界面。你可以根据需要进一步扩展和定制。