Flutter交互式日历插件interactive_calendar的使用

Flutter交互式日历插件interactive_calendar的使用

一个用于Flutter的交互式日历包,提供多种显示模式和可定制的样式。

特性

  • 使用intl包内置支持本地化。
  • 支持暗色模式。
  • 可以显示单个月份或整年。
  • 高亮特定日期。
  • 提供点击高亮和非高亮日期时的回调函数。
  • 可自定义文本和高亮颜色。

重要提示: 传递给InteractiveCalendar小部件的currentDate值对应的年份将是显示的年份。如果提供了onNextYear回调,则用户可以导航到下一年。在这种情况下,开发者负责相应地更新currentDate值。

开始使用

要使用此软件包,请在您的pubspec.yaml文件中添加interactive_calendar作为依赖项。

使用方法

首先,导入该包:

import 'package:interactive_calendar/interactive_calendar.dart';

然后可以在代码中这样使用:

InteractiveCalendar(
  highlightedDays: [DateTime.now()],
  onHighlightedDayTap: (DateTime date) {
    print("Tapped on $date");
  },
  currentDate: DateTime.now(),
  darkMode: false,
  displayMode: DisplayMode.column
),

以下是各个属性的含义:

  • highlightedDays: 一个包含DateTime对象的列表,表示应在日历上高亮显示的日期。
  • onHighlightedDayTap: 用户点击高亮日期时调用的回调函数。
  • currentDate: 一个DateTime对象,表示当前日期。日历将显示与该日期相对应的月份和年份。
  • darkMode: 一个布尔值,指示是否应以暗色模式显示日历。
  • displayMode: 一个枚举值,指示日历的显示模式,可以是DisplayMode.column(全年视图)或DisplayMode.singleMonth(单月视图)。

还可以通过textHighLightColorhighLightColor属性分别自定义高亮日期的文本和背景颜色。

示例代码

以下是一个完整的示例代码,展示了如何在应用中使用InteractiveCalendar

import 'package:flutter/material.dart';
import 'package:interactive_calendar/interactive_calendar.dart';
import 'package:intl/intl.dart';

void main() {
  runApp(
    const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyHomePage(
        title: 'Interactive Calendar Demo',
      ),
    ),
  );
}

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> {
  bool darkMode = false;
  final controller = PageController();
  var currentDate = DateTime.now();
  final highlightedDays = [
    DateTime(2023, 1, 1),
    DateTime(2023, 1, 7),
    DateTime(2023, 1, 15),
    DateTime(2023, 1, 18),
    DateTime(2023, 2, 2),
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        backgroundColor: darkMode ? Colors.black : null,
        appBar: AppBar(
          title: Text(widget.title),
          bottom: const TabBar(
            tabs: [
              Tab(
                text: 'Single Month display',
              ),
              Tab(
                text: 'Column display',
              ),
            ],
          ),
          actions: [
            IconButton(
              onPressed: () {
                setState(() {
                  darkMode = !darkMode;
                });
              },
              icon: Icon(
                darkMode ? Icons.dark_mode_rounded : Icons.light_mode_rounded,
              ),
            )
          ],
        ),
        body: TabBarView(
          children: [
            InteractiveCalendar(
              displayMode: DisplayMode.singleMonth,
              onPreviousYear: previousYear(),
              onHighlightedDayTap: onDayTap,
              onOtherDayTap: onDayTap,
              currentDate: currentDate,
              onNextYear: nextYear(),
              darkMode: darkMode,
              highlightedDays: highlightedDays,
            ),
            InteractiveCalendar(
              displayMode: DisplayMode.column,
              onPreviousYear: previousYear(),
              onHighlightedDayTap: onDayTap,
              currentDate: currentDate,
              onNextYear: nextYear(),
              darkMode: darkMode,
              highlightedDays: highlightedDays,
            ),
          ],
        ),
      ),
    );
  }

  Function()? nextYear() {
    return currentDate.year < 2030
        ? () {
            setState(() {
              currentDate = yearAfter(currentDate);
            });
          }
        : null;
  }

  Function()? previousYear() {
    return currentDate.year > 2020
        ? () {
            setState(() {
              currentDate = yearBefore(currentDate);
            });
          }
        : null;
  }

  void onDayTap(dateTime) {
    showDialog<String>(
      context: context,
      builder: (BuildContext context) {
        final date = DateFormat.yMMMMd().format(dateTime);

        return AlertDialog(
          title: const Text('On Tap'),
          content: Text(date),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.pop(context, 'OK'),
              child: const Text('OK'),
            ),
          ],
        );
      },
    );
  }
}

DateTime yearAfter(DateTime date) {
  return DateTime(
    date.year + 1,
    date.month,
    date.day,
  );
}

DateTime yearBefore(DateTime date) {
  return DateTime(
    date.year - 1,
    date.month,
    date.day,
  );
}

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

1 回复

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


interactive_calendar 是一个 Flutter 插件,用于在应用中显示一个交互式的日历。它允许用户选择日期、查看事件、以及进行其他与日历相关的操作。以下是如何使用 interactive_calendar 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  interactive_calendar: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 interactive_calendar 包:

import 'package:interactive_calendar/interactive_calendar.dart';

3. 使用 InteractiveCalendar 组件

你可以在你的应用中使用 InteractiveCalendar 组件来显示日历。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:interactive_calendar/interactive_calendar.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Interactive Calendar Example'),
        ),
        body: InteractiveCalendar(
          onDateSelected: (DateTime selectedDate) {
            print("Selected Date: $selectedDate");
          },
          events: {
            DateTime(2023, 10, 15): ['Event 1', 'Event 2'],
            DateTime(2023, 10, 20): ['Event 3'],
          },
        ),
      ),
    );
  }
}

4. 自定义日历

InteractiveCalendar 提供了多个参数来自定义日历的外观和行为。以下是一些常用的参数:

  • onDateSelected: 当用户选择一个日期时触发的回调函数。
  • events: 一个 Map<DateTime, List<String>>,用于在日历中显示事件。
  • initialDate: 初始显示的日期,默认为当前日期。
  • firstDate: 用户可以选择的第一个日期,默认为 DateTime(1900)
  • lastDate: 用户可以选择的最后一个日期,默认为 DateTime(2100)
  • selectedColor: 选中日期的背景颜色。
  • todayColor: 当前日期的背景颜色。
  • eventColor: 事件标记的颜色。

5. 处理事件

你可以通过 events 参数将事件与特定日期关联起来。事件将以小点的形式显示在日期下方。用户点击日期时,你可以通过 onDateSelected 回调来处理该日期的点击事件。

6. 进一步定制

你可以根据需要进一步定制日历的外观和行为。例如,你可以使用 headerBuilderdayBuilder 来自定义日历的头部和日期单元格的显示。

InteractiveCalendar(
  onDateSelected: (DateTime selectedDate) {
    print("Selected Date: $selectedDate");
  },
  events: {
    DateTime(2023, 10, 15): ['Event 1', 'Event 2'],
    DateTime(2023, 10, 20): ['Event 3'],
  },
  headerBuilder: (context, date) {
    return Center(
      child: Text(
        '${date.month}/${date.year}',
        style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
      ),
    );
  },
  dayBuilder: (context, date, isSelected, isToday, hasEvents) {
    return Container(
      margin: EdgeInsets.all(4),
      decoration: BoxDecoration(
        color: isSelected ? Colors.blue : (isToday ? Colors.green : null),
        shape: BoxShape.circle,
      ),
      child: Center(
        child: Text(
          '${date.day}',
          style: TextStyle(
            color: isSelected ? Colors.white : Colors.black,
            fontWeight: isSelected ? FontWeight.bold : FontWeight.normal,
          ),
        ),
      ),
    );
  },
);
回到顶部