Flutter日历日程管理插件calendar_day_slot_navigator的使用

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

Flutter日历日程管理插件 calendar_day_slot_navigator 的使用

概述

calendar_day_slot_navigator 是一个功能强大且高度可定制的Flutter日历小部件,使日期选择变得美观和直观。无论是构建预订应用、调度系统还是任何需要优雅日期选择的应用程序,它都提供了所需的灵活性和功能。

Banner

特性

主题支持

  • 无缝集成浅色和深色模式
  • 完全控制颜色和渐变
  • 自定义活动和非活动状态

高级自定义

  • 所有元素的灵活圆角半径
  • 自定义标题文本和样式
  • 可调的日框尺寸和边框
  • 支持自定义字体,包括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 确定日期框中的日期名称出现的位置。选择outsideDateBoxinsideDateBox

样式属性

属性 类型 默认值 描述
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

1 回复

更多关于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'),
        ),
      ],
    ),
  );
}

解释

  1. 依赖注入: 使用provider包来管理CalendarProvider的状态。
  2. CalendarProvider: 管理当前选择的日期和事件列表。
  3. CalendarScreen: 主要的UI组件,包含CalendarDaySlotNavigator和浮动操作按钮来添加新事件。
  4. Event: 简单的数据模型,包含日期和标题。
  5. showEventCreationDialog: 显示一个对话框来添加新事件。

注意事项

  • 请确保在实际项目中处理更多的边界情况和错误处理。
  • 根据需求自定义UI和交互。
  • 插件的版本可能会更新,请查阅最新的文档和示例代码。

这个示例展示了如何使用calendar_day_slot_navigator插件来创建一个基本的日历日程管理界面。你可以根据需要进一步扩展和定制。

回到顶部