Flutter周日历展示插件weekly_calendar的使用

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

Flutter周日历展示插件weekly_calendar的使用

pub package

weekly_calendar 是一个非常简单的 Flutter 周日历小部件。

示例图

特性

  • 简单的日历小部件
  • 支持多语言
  • 可自定义颜色方案

使用方法

安装

要在项目中使用此小部件,请在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  weekly_calendar: ^0.1.2

基本设置

以下是一个基本的使用示例:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Center(
          child: WeeklyCalendar(),
        ),
      ),
    );
  }
}

日历样式

通过使用 CalendarStyle,你可以自定义 WeeklyCalendar 的颜色方案。以下是 CalendarStyle 的属性说明:

class CalendarStyle {
  final String locale; // 日历的语言
  final EdgeInsets padding; // 日历的内边距
  final EdgeInsets margin; // 日历的外边距
  final BoxDecoration decoration; // 日历的装饰
  final Alignment headerDateTextAlign; // 头部日期文本的对齐方式
  final Color headerDateTextColor; // 头部日期文本的颜色
  final bool isShowHeaderDateText; // 是否显示头部日期文本
  final Alignment footerDateTextAlign; // 底部日期文本的对齐方式
  final Color footerDateTextColor; // 底部日期文本的颜色
  final bool isShowFooterDateText; // 是否显示底部日期文本
  final Color selectedCircleColor; // 选中的圆圈颜色
  final Color todaySelectedCircleColor; // 今天选中的圆圈颜色
  final Color dayTextColor; // 日文字的颜色
  final Color todayDayTextColor; // 今天日文字的颜色
  final Color selectedDayTextColor; // 选中的日文字颜色
  final Color weekendDayTextColor; // 周末日文字的颜色
  final Color dayOfWeekTextColor; // 星期几文字的颜色
  final Color weekendDayOfWeekTextColor; // 周末星期几文字的颜色
}

使用 CalendarStyle 设置日历样式:

WeeklyCalendar(
  style: CalendarStyle(
    locale: "en",
    padding: EdgeInsets.all(10),
    decoration: BoxDecoration(
      color: Colors.black,
      borderRadius: BorderRadius.all(Radius.circular(14)),
    ),
    headerDateTextAlign: Alignment.centerLeft,
    headerDateTextColor: Colors.white,
    footerDateTextColor: Colors.grey,
    isShowFooterDateText: true,
  ),
)

事件

你可以通过回调函数 onChangedSelectedDate 获取选中的日期:

onChangedSelectedDate: (DateTime date) {
  debugPrint("onChangedSelectedDate: $date");
}

你可以通过 isAutoSelect 参数控制在滑动切换显示的周页面时是否自动选择日期:

isAutoSelect: true,

你还可以通过 onChangedPage 回调函数获取当前周三的日期和页面状态(上一页或下一页):

onChangedPage: (DateTime date, PageState state) {
  debugPrint("onChangedPage: $date ${state.name}");
}

示例代码

以下是一个完整的示例代码,展示了如何使用 weekly_calendar 插件:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.grey[200],
        appBar: AppBar(),
        body: Column(
          children: [
            WeeklyCalendar(
              calendarStyle: const CalendarStyle(
                locale: "en_US",
                padding: EdgeInsets.symmetric(vertical: 14, horizontal: 20),
                margin: EdgeInsets.all(14),
                decoration: BoxDecoration(
                  color: Colors.black,
                  borderRadius: BorderRadius.all(Radius.circular(14)),
                ),
                headerDateTextColor: Colors.white,
                headerDateTextAlign: Alignment.center,
                isShowHeaderDateText: false,
                footerDateTextColor: Colors.white,
                footerDateTextAlign: Alignment.center,
                isShowFooterDateText: false,
                selectedCircleColor: Colors.white,
                todaySelectedCircleColor: Colors.greenAccent,
                dayTextColor: Colors.white,
                todayDayTextColor: Colors.greenAccent,
                selectedDayTextColor: Colors.black,
                weekendDayTextColor: Colors.grey,
                dayOfWeekTextColor: Colors.white,
                weekendDayOfWeekTextColor: Colors.grey,
              ),
              isAutoSelect: true,
              onChangedSelectedDate: (date) {
                debugPrint("onChangedSelectedDate: $date");
              },
              onChangedPage: (date, state) {
                debugPrint("onChangedPage: $date ${state.name}");
              },
            ),
          ],
        ),
      ),
    );
  }
}

希望这个示例能帮助你更好地理解和使用 weekly_calendar 插件!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用weekly_calendar插件来展示周日历的示例代码。这个示例将展示如何初始化插件、配置日历以及处理一些基本的日历事件。

首先,确保你已经在pubspec.yaml文件中添加了weekly_calendar依赖:

dependencies:
  flutter:
    sdk: flutter
  weekly_calendar: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,在你的Flutter项目中创建一个新的Dart文件(例如main.dart),并添加以下代码来展示周日历:

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

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

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

class WeeklyCalendarPage extends StatefulWidget {
  @override
  _WeeklyCalendarPageState createState() => _WeeklyCalendarPageState();
}

class _WeeklyCalendarPageState extends State<WeeklyCalendarPage> {
  late WeeklyController _controller;

  @override
  void initState() {
    super.initState();
    _controller = WeeklyController(
      date: DateTime.now(),
      firstDayOfWeek: DateTime.monday,
      events: _getEvents(),
      onEventSelected: (event) {
        print('Event selected: ${event.title}');
      },
      onDateSelected: (date) {
        print('Date selected: $date');
      },
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  List<WeeklyEvent> _getEvents() {
    return [
      WeeklyEvent(
        id: '1',
        title: 'Event 1',
        startTime: DateTime(2023, 10, 8, 10, 0),
        endTime: DateTime(2023, 10, 8, 12, 0),
        allDay: false,
      ),
      WeeklyEvent(
        id: '2',
        title: 'All Day Event',
        startTime: DateTime(2023, 10, 9),
        endTime: DateTime(2023, 10, 9).add(Duration(days: 1)),
        allDay: true,
      ),
      // 添加更多事件...
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Weekly Calendar Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: WeeklyCalendar(
          controller: _controller,
          headerBuilder: (context, date, locale) {
            return Text(
              DateFormat.EEEE('zh_CN').format(date),
              style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
            );
          },
          dayBuilder: (context, date) {
            return Container(
              decoration: BoxDecoration(
                color: _controller.isSelected(date) ? Colors.blue.withOpacity(0.1) : Colors.transparent,
                border: Border.all(color: Colors.grey.withOpacity(0.2)),
              ),
              child: Center(
                child: Text(
                  DateFormat.d('zh_CN').format(date),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:首先导入flutterweekly_calendar包。
  2. 主应用:创建MyApp类作为应用的根组件。
  3. 日历页面:创建WeeklyCalendarPage类作为展示周日历的页面,它是一个有状态的组件。
  4. 控制器初始化:在initState方法中初始化WeeklyController,设置当前日期、一周的第一天、事件列表以及事件选择和日期选择的回调。
  5. 事件数据_getEvents方法返回一个事件列表,每个事件包含ID、标题、开始时间、结束时间和是否为全天事件的信息。
  6. 构建日历:在build方法中,使用WeeklyCalendar组件来展示日历,并通过headerBuilderdayBuilder来自定义头部和日期的显示。

注意事项:

  • 确保你已经正确安装了weekly_calendar插件,并且使用的版本与代码示例兼容。
  • 根据你的需求调整事件数据和日历的样式。
  • 你可以进一步扩展代码,例如添加事件的添加、删除和编辑功能。

希望这个示例能帮助你更好地理解和使用weekly_calendar插件!

回到顶部