Flutter日历插件emorphiscalendar的使用

Flutter日历插件emorphiscalendar的使用

Emorphis Calendar 是一个高度可定制且功能丰富的 Flutter 日历小部件。它支持多种视图(如月视图和周视图),并且可以轻松导航和选择日期。此外,它还提供了事件日历功能,支持动态事件、日期范围限制以及事件点颜色等。

特性

  • 月视图日历:显示一整个月份,并允许用户选择日期。当前日期会被高亮显示,周日会以红色标记。
  • 周视图日历:一次显示一周,并支持通过滑动在不同周之间导航。
  • 事件列表:为选定的日期显示事件列表,每个事件项都带有边框和内边距,便于清晰查看。

安装

将以下依赖项添加到您的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  emorphiscalendar: ^0.0.4

然后运行以下命令以获取依赖项:

flutter pub get

使用方法

月视图日历

以下是一个简单的月视图日历示例:

import 'package:flutter/material.dart';
import 'package:emorphiscalendar/calendar/emorphis_month_calendar.dart';

class MonthlyCalendarScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Monthly Calendar')),
      body: EmorphisMonthCalendar(),
    );
  }
}

周视图日历

以下是一个简单的周视图日历示例:

import 'package:flutter/material.dart';
import 'package:emorphiscalendar/calendar/emorphis_week_calendar.dart';

class WeeklyCalendarScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Weekly Calendar')),
      body: EmorphisWeekCalendar(),
    );
  }
}

自定义周视图日历

以下是一个自定义周视图日历的示例:

import 'package:flutter/material.dart';
import 'package:emorphiscalendar/calendar/custom_week_day.dart';

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Custom Week Day'),
        backgroundColor: Colors.blue.withOpacity(0.5),
      ),
      body: Center(
        child: CustomWeekDay(
          onDateSelected: (date) {
            print(date); // 打印选中的日期
          },
        ),
      ),
    );
  }
}

事件日历

以下是一个包含事件的日历示例:

import 'package:flutter/material.dart';
import 'package:emorphiscalendar/calendar/emorphis_event_calendar.dart';

class EventCalendarScreen extends StatefulWidget {
  [@override](/user/override)
  _EventCalendarScreenState createState() => _EventCalendarScreenState();
}

class _EventCalendarScreenState extends State<EventCalendarScreen> {
  DateTime _focusedDay = DateTime.now();
  DateTime _selectedDay = DateTime.now();
  Map<DateTime, List<String>> _events = {};

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Emorphis Event Calendar'),
        backgroundColor: Colors.blue.withOpacity(0.5),
        actions: [_buildAddEventButton()],
      ),
      body: Column(
        children: [
          EmorphisEventCalendar(
            focusedDay: _focusedDay,
            selectedDay: _selectedDay,
            events: _events,
            onDaySelected: (selectedDay) {
              setState(() {
                _selectedDay = selectedDay;
              });
            },
            onFocusedDayChanged: (focusedDay) {
              setState(() {
                _focusedDay = focusedDay;
              });
            },
          ),
          if (_events[_selectedDay] != null) _buildEventList(),
        ],
      ),
    );
  }

  Widget _buildEventList() {
    return Expanded(
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 10.0),
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: _events[_selectedDay]?.length ?? 0,
          itemBuilder: (context, index) {
            return Container(
              padding: const EdgeInsets.all(10.0),
              margin: const EdgeInsets.only(bottom: 8.0),
              decoration: BoxDecoration(
                border: Border.all(color: Colors.black, width: 0.5),
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Text(_events[_selectedDay]![index]),
            );
          },
        ),
      ),
    );
  }

  Widget _buildAddEventButton() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: ElevatedButton(
        onPressed: () async {
          String? event = await _addEventDialog();
          if (event != null && event.isNotEmpty) {
            final updatedEvents = Map<DateTime, List<String>>.from(_events);
            updatedEvents[_selectedDay] = updatedEvents[_selectedDay] ?? [];
            updatedEvents[_selectedDay]!.add(event);
            setState(() {
              _events = updatedEvents;
            });
          }
        },
        child: const Text("Add Event"),
      ),
    );
  }

  Future<String?> _addEventDialog() {
    TextEditingController _controller = TextEditingController();

    return showDialog<String>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text("Add Event"),
          content: TextField(
            controller: _controller,
            decoration: const InputDecoration(hintText: 'Enter event details'),
          ),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: const Text('Cancel'),
            ),
            TextButton(
              onPressed: () {
                Navigator.of(context).pop(_controller.text);
              },
              child: const Text('Add'),
            ),
          ],
        );
      },
    );
  }
}

节日日历

以下是一个节日日历的示例:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:emorphiscalendar/calendar/emorphis_holiday_calendar.dart';
import 'package:http/http.dart' as http;
import 'country.dart';

class HolidayCalendarScreen extends StatefulWidget {
  [@override](/user/override)
  State<HolidayCalendarScreen> createState() => _HolidayCalendarScreenState();
}

class _HolidayCalendarScreenState extends State<HolidayCalendarScreen> {
  List<Holiday> holidays = [];
  DateTime _focusedDay = DateTime.now();
  String _selectedCountryCode = 'US'; // 默认国家代码

  final List<DropdownMenuItem<String>> dropdownItems = countryList.map((Country country) {
    return DropdownMenuItem<String>(
      value: country.code,
      child: Text(country.name),
    );
  }).toList();

  Future<List<Holiday>> fetchHolidays(String countryCode, int year) async {
    final response = await http.get(
      Uri.parse('https://date.nager.at/Api/v2/PublicHolidays/$year/$countryCode'),
    );
    if (response.statusCode == 200) {
      final List<dynamic> data = json.decode(response.body);
      return data.map((holiday) {
        return Holiday(
          DateTime.parse(holiday['date']),
          holiday['name'],
        );
      }).toList();
    } else {
      setState(() {
        _focusedDay = _focusedDay;
        holidays = [];
      });
      throw Exception('Failed to load holidays');
    }
  }

  void _updateHolidays(DateTime newFocusedDay) {
    final newYear = newFocusedDay.year;
    fetchHolidays(_selectedCountryCode, newYear).then(
      (value) {
        setState(() {
          holidays = value;
          _focusedDay = newFocusedDay;
        });
      },
    );
  }

  void _onCountryCodeChanged(String? newCountryCode) {
    if (newCountryCode != null) {
      setState(() {
        _selectedCountryCode = newCountryCode;
        _updateHolidays(_focusedDay);
      });
    }
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    // 获取当前年份的节日数据
    _updateHolidays(DateTime.now());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Holiday Calendar'),
        actions: [
          Align(
            alignment: Alignment.centerLeft,
            child: SizedBox(
              width: 150, // 调整宽度以适应屏幕
              child: DropdownButton<String>(
                value: _selectedCountryCode,
                onChanged: _onCountryCodeChanged,
                items: dropdownItems,
                isExpanded: true,
                autofocus: true,
              ),
            ),
          ),
        ],
      ),
      body: EmorphisHolidayCalendar(
        holidays: holidays,
        initialFocusedDay: _focusedDay,
        initialSelectedDay: DateTime.now(),
        onFocusedDayChanged: _updateHolidays,
      ),
    );
  }
}

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

1 回复

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


emorphis_calendar 是一个 Flutter 插件,用于在 Flutter 应用中显示和管理日历视图。它提供了灵活的配置选项,允许开发者自定义日历的外观和行为。以下是如何在 Flutter 项目中使用 emorphis_calendar 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  emorphis_calendar: ^latest_version

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

2. 导入插件

在你的 Dart 文件中导入 emorphis_calendar 插件:

import 'package:emorphis_calendar/emorphis_calendar.dart';

3. 使用 EmorphisCalendar 组件

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

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Emorphis Calendar Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CalendarExample(),
    );
  }
}

class CalendarExample extends StatefulWidget {
  @override
  _CalendarExampleState createState() => _CalendarExampleState();
}

class _CalendarExampleState extends State<CalendarExample> {
  DateTime _selectedDate = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Emorphis Calendar'),
      ),
      body: EmorphisCalendar(
        initialDate: _selectedDate,
        onDaySelected: (date) {
          setState(() {
            _selectedDate = date;
          });
        },
        selectedDayPredicate: (date) {
          return isSameDay(_selectedDate, date);
        },
      ),
    );
  }
}

4. 自定义日历

EmorphisCalendar 提供了多种配置选项,允许你自定义日历的外观和行为。以下是一些常见的配置选项:

  • initialDate: 初始显示的日期。
  • firstDate: 允许选择的最早日期。
  • lastDate: 允许选择的最晚日期。
  • onDaySelected: 当用户选择某一天时触发的回调。
  • selectedDayPredicate: 用于确定某一天是否被选中的回调。
  • calendarFormat: 日历的显示格式(如月视图、周视图等)。
  • headerStyle: 自定义日历头部的样式。
  • calendarStyle: 自定义日历的样式。

5. 处理事件

你可以通过 onDaySelected 回调来处理用户选择某一天的事件。例如,你可以在用户选择某一天时显示一个对话框或更新应用的状态。

onDaySelected: (date) {
  setState(() {
    _selectedDate = date;
  });
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: Text('Selected Date'),
      content: Text('You selected: $date'),
      actions: [
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: Text('OK'),
        ),
      ],
    ),
  );
},

6. 自定义样式

你可以通过 headerStylecalendarStyle 来自定义日历的样式。例如:

EmorphisCalendar(
  headerStyle: HeaderStyle(
    formatButtonVisible: false,
    titleTextStyle: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
  ),
  calendarStyle: CalendarStyle(
    selectedDecoration: BoxDecoration(
      color: Colors.blue,
      shape: BoxShape.circle,
    ),
    todayDecoration: BoxDecoration(
      color: Colors.blueAccent,
      shape: BoxShape.circle,
    ),
  ),
  // 其他配置...
),
回到顶部