Flutter日历轮播插件flutter_calendar_carousel的使用

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

Flutter日历轮播插件 flutter_calendar_carousel 的使用

flutter_calendar_carousel 是一个支持水平滑动的日历小部件,高度可定制化,并且可以为每个事件添加自定义图标。以下是该插件的详细使用方法和示例代码。

安装

pubspec.yaml 文件中添加 flutter_calendar_carousel 作为依赖项:

dependencies:
  flutter_calendar_carousel: ^2.4.0

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

flutter pub get

示例 Demo

下面是一个完整的示例代码,展示了如何使用 flutter_calendar_carousel 插件。

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:flutter_calendar_carousel/flutter_calendar_carousel.dart' show CalendarCarousel;
import 'package:flutter_calendar_carousel/classes/event.dart';
import 'package:flutter_calendar_carousel/classes/event_list.dart';
import 'package:intl/intl.dart' show DateFormat;

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DateTime _currentDate = DateTime(2019, 2, 3);
  DateTime _currentDate2 = DateTime(2019, 2, 3);
  String _currentMonth = DateFormat.yMMM().format(DateTime(2019, 2, 3));
  DateTime _targetDateTime = DateTime(2019, 2, 3);

  static Widget _eventIcon = Container(
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.all(Radius.circular(1000)),
      border: Border.all(color: Colors.blue, width: 2.0),
    ),
    child: Icon(Icons.person, color: Colors.amber),
  );

  EventList<Event> _markedDateMap = EventList(events: {
    DateTime(2019, 2, 10): [
      Event(date: DateTime(2019, 2, 10), title: 'Event 1', icon: _eventIcon, dot: Container(margin: EdgeInsets.symmetric(horizontal: 1.0), color: Colors.red, height: 5.0, width: 5.0)),
      Event(date: DateTime(2019, 2, 10), title: 'Event 2', icon: _eventIcon),
      Event(date: DateTime(2019, 2, 10), title: 'Event 3', icon: _eventIcon),
    ],
  });

  @override
  void initState() {
    _markedDateMap.add(DateTime(2019, 2, 25), Event(date: DateTime(2019, 2, 25), title: 'Event 5', icon: _eventIcon));
    _markedDateMap.add(DateTime(2019, 2, 10), Event(date: DateTime(2019, 2, 10), title: 'Event 4', icon: _eventIcon));
    _markedDateMap.addAll(DateTime(2019, 2, 11), [
      Event(date: DateTime(2019, 2, 11), title: 'Event 1', icon: _eventIcon),
      Event(date: DateTime(2019, 2, 11), title: 'Event 2', icon: _eventIcon),
      Event(date: DateTime(2019, 2, 11), title: 'Event 3', icon: _eventIcon),
    ]);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final _calendarCarousel = CalendarCarousel<Event>(
      onDayPressed: (date, events) {
        setState(() => _currentDate = date);
        events.forEach((event) => print(event.title));
      },
      weekendTextStyle: TextStyle(color: Colors.red),
      thisMonthDayBorderColor: Colors.grey,
      headerText: 'Custom Header',
      weekFormat: true,
      markedDatesMap: _markedDateMap,
      height: 200.0,
      selectedDateTime: _currentDate2,
      showIconBehindDayText: true,
      customGridViewPhysics: NeverScrollableScrollPhysics(),
      markedDateShowIcon: true,
      markedDateIconMaxShown: 2,
      selectedDayTextStyle: TextStyle(color: Colors.yellow),
      todayTextStyle: TextStyle(color: Colors.blue),
      markedDateIconBuilder: (event) => event.icon ?? Icon(Icons.help_outline),
      minSelectedDate: _currentDate.subtract(Duration(days: 360)),
      maxSelectedDate: _currentDate.add(Duration(days: 360)),
      todayButtonColor: Colors.transparent,
      todayBorderColor: Colors.green,
      markedDateMoreShowTotal: true,
    );

    final _calendarCarouselNoHeader = CalendarCarousel<Event>(
      todayBorderColor: Colors.green,
      onDayPressed: (date, events) {
        setState(() => _currentDate2 = date);
        events.forEach((event) => print(event.title));
      },
      daysHaveCircularBorder: true,
      showOnlyCurrentMonthDate: false,
      weekendTextStyle: TextStyle(color: Colors.red),
      thisMonthDayBorderColor: Colors.grey,
      weekFormat: false,
      markedDatesMap: _markedDateMap,
      height: 420.0,
      selectedDateTime: _currentDate2,
      targetDateTime: _targetDateTime,
      customGridViewPhysics: NeverScrollableScrollPhysics(),
      markedDateCustomShapeBorder: CircleBorder(side: BorderSide(color: Colors.yellow)),
      markedDateCustomTextStyle: TextStyle(fontSize: 18, color: Colors.blue),
      showHeader: false,
      todayTextStyle: TextStyle(color: Colors.blue),
      todayButtonColor: Colors.yellow,
      selectedDayTextStyle: TextStyle(color: Colors.yellow),
      minSelectedDate: _currentDate.subtract(Duration(days: 360)),
      maxSelectedDate: _currentDate.add(Duration(days: 360)),
      prevDaysTextStyle: TextStyle(fontSize: 16, color: Colors.pinkAccent),
      inactiveDaysTextStyle: TextStyle(color: Colors.tealAccent, fontSize: 16),
      onCalendarChanged: (DateTime date) {
        setState(() {
          _targetDateTime = date;
          _currentMonth = DateFormat.yMMM().format(_targetDateTime);
        });
      },
      onDayLongPressed: (DateTime date) => print('long pressed date $date'),
    );

    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            Container(
              margin: EdgeInsets.symmetric(horizontal: 16.0),
              child: _calendarCarousel,
            ),
            Container(
              margin: EdgeInsets.only(top: 30.0, bottom: 16.0, left: 16.0, right: 16.0),
              child: Row(
                children: <Widget>[
                  Expanded(child: Text(_currentMonth, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 24.0))),
                  TextButton(child: Text('PREV'), onPressed: () {
                    setState(() {
                      _targetDateTime = DateTime(_targetDateTime.year, _targetDateTime.month - 1);
                      _currentMonth = DateFormat.yMMM().format(_targetDateTime);
                    });
                  }),
                  TextButton(child: Text('NEXT'), onPressed: () {
                    setState(() {
                      _targetDateTime = DateTime(_targetDateTime.year, _targetDateTime.month + 1);
                      _currentMonth = DateFormat.yMMM().format(_targetDateTime);
                    });
                  })
                ],
              ),
            ),
            Container(
              margin: EdgeInsets.symmetric(horizontal: 16.0),
              child: _calendarCarouselNoHeader,
            ),
          ],
        ),
      ),
    );
  }
}

关键属性说明

  • onDayPressed: 当用户点击某一天时触发的回调函数。
  • weekendTextStyle: 设置周末日期的文本样式。
  • thisMonthDayBorderColor: 当前月份日期的边框颜色。
  • headerText: 日历头部显示的文本。
  • weekFormat: 是否以周视图显示日历。
  • markedDatesMap: 标记特定日期的事件列表。
  • height: 日历的高度。
  • selectedDateTime: 当前选中的日期。
  • showIconBehindDayText: 是否在日期文本后面显示图标。
  • customGridViewPhysics: 自定义滚动物理属性。
  • markedDateShowIcon: 是否显示标记日期的图标。
  • minSelectedDatemaxSelectedDate: 允许选择的最小和最大日期范围。

通过上述示例代码,你可以快速上手并开始使用 flutter_calendar_carousel 插件来构建自己的日历应用。如果你需要进一步的功能扩展或自定义设置,请参考官方文档中的更多属性配置。


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

1 回复

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


当然,以下是一个关于如何使用 flutter_calendar_carousel 插件的详细代码示例。这个插件允许你在 Flutter 应用中创建一个日历轮播组件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_calendar_carousel: ^3.0.0 # 请根据需要替换为最新版本

然后运行 flutter pub get 来获取依赖。

以下是一个完整的 Flutter 应用示例,展示了如何使用 flutter_calendar_carousel 插件:

import 'package:flutter/material.dart';
import 'package:flutter_calendar_carousel/flutter_calendar_carousel.dart';
import 'package:flutter_calendar_carousel/date_time_extension.dart';

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

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

class CalendarScreen extends StatefulWidget {
  @override
  _CalendarScreenState createState() => _CalendarScreenState();
}

class _CalendarScreenState extends State<CalendarScreen> {
  DateTime _selectedDate;
  List<DateTime> _markedDates = [];
  List<DateTime> _specialDates = [];
  CalendarController _controller;

  @override
  void initState() {
    super.initState();
    _selectedDate = DateTime.now();
    _markedDates = List.generate(30, (index) {
      return _selectedDate.add(Duration(days: index));
    });

    _specialDates = [
      DateTime(2023, 10, 1),
      DateTime(2023, 10, 15),
      DateTime(2023, 10, 30),
    ];

    _controller = CalendarController();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Calendar Carousel Demo'),
      ),
      body: CalendarCarousel<DateTime>(
        this._selectedDate,
        this._markedDates,
        this._specialDates,
        height: 400.0,
        selectedDateColor: Colors.blue,
        todayColor: Colors.red,
        markedDateColor: Colors.grey,
        specialDateColor: Colors.purple,
        specialDateTextStyle: TextStyle(fontWeight: FontWeight.bold),
        weekFormat: false,
        isExpanded: true,
        headerTextStyle: TextStyle(fontSize: 20, color: Colors.black87),
        dayTextStyle: TextStyle(fontSize: 16, color: Colors.black),
        onDayPressed: (DateTime date, List<DateTime> selectedDates) {
          setState(() {
            _selectedDate = date;
          });
        },
        controller: _controller,
      ),
    );
  }
}

代码说明:

  1. 依赖导入

    • 导入 flutter_calendar_carouseldate_time_extension 包。
  2. 主应用

    • MyApp 类作为主应用入口,设置主题并跳转到 CalendarScreen 页面。
  3. 日历页面

    • CalendarScreen 是一个有状态组件,用于管理日历的状态。
    • initState 方法中,初始化选中的日期、标记日期和特殊日期。
    • CalendarController 用于控制日历组件的行为。
  4. 日历组件

    • CalendarCarousel 是主要的日历组件,接收多个参数:
      • selectedDate:当前选中的日期。
      • markedDates:标记日期列表。
      • specialDates:特殊日期列表。
      • height:日历组件的高度。
      • selectedDateColortodayColormarkedDateColorspecialDateColor:各种日期的颜色。
      • specialDateTextStyle:特殊日期的文本样式。
      • weekFormat:是否显示周格式。
      • isExpanded:是否展开日历。
      • headerTextStyledayTextStyle:头部和日期的文本样式。
      • onDayPressed:日期点击回调。
      • controller:日历控制器。

这个示例展示了如何使用 flutter_calendar_carousel 插件创建一个功能齐全的日历轮播组件,包括标记日期、特殊日期、日期点击事件等功能。你可以根据实际需求进一步定制和扩展这个示例。

回到顶部