Flutter日历展示插件mini_calendar的使用
Flutter日历展示插件mini_calendar的使用
mini_calendar
Date component developed with Flutter, plans to support display, swipe left and right, add date mark, radio, display week, etc.
使用Flutter开发的日期组件,计划支持显示,左右滑动,添加日期标记,单选,显示星期等功能。
- 更新记录
主要想实现的内容

使用
引入库
dependencies:
mini_calendar: ^2.0.0
导包
import 'package:mini_calendar/mini_calendar.dart';
月视图(MonthWidget)
MonthWidget(); // 默认当月
- 可通过控制器参数来控制显示的月份以及选择的日期
MonthWidget(
controller: MonthController.init(
MonthOption<String>(
currentDay: DateDay.now().copyWith(month: index + 1, day: Random().nextInt(27) + 1),
currentMonth: DateMonth.now().copyWith(month: index + 1),
)
),
)
- 支持显示连选
MonthWidget(
controller: MonthController.init(MonthOption(
currentMonth: DateMonth.now().copyWith(month: 1),
enableContinuous: true,
firstSelectDay: DateDay.now().copyWith(month: 1, day: 8),
secondSelectDay: DateDay.now().copyWith(month: 1, day: 18),
)),
)
- 支持多选
MonthWidget(
controller: MonthController.init(MonthOption(
currentMonth: DateMonth.now().copyWith(month: 1),
enableMultiple: true,
multipleDays: [
DateDay.now().copyWith(month: 1, day: 3),
DateDay.now().copyWith(month: 1, day: 5),
DateDay.now().copyWith(month: 1, day: 8),
],
)),
)
-
支持添加标记
-
……

滚动日历(MonthPageView)
控制器需要创建后获取
onCreated
MonthPageView<T>(
padding: EdgeInsets.all(1),
scrollDirection: Axis.horizontal, // 水平滑动或者竖直滑动
option: MonthOption<T>(
enableContinuous: true, // 单选、连选控制
marks: {
DateDay.now().copyWith(day: 1): '111',
DateDay.now().copyWith(day: 5): '222',
DateDay.now().copyWith(day: 13): '333',
DateDay.now().copyWith(day: 19): '444',
DateDay.now().copyWith(day: 26): '444',
},
),
showWeekHead: true, // 显示星期头部
onContinuousSelectListen: (DateDay?firstDay,DateDay?endFay) {
}, // 连选回调
onMultipleSelectListen: (list) {
}, // 多选回调
onMonthChange: (month) {
}, // 月份更改回调
onDaySelected: (DateDay day, T? markData, bool enable) {
// enable : 是否是可选日期
}, // 日期选中回调
onCreated: (controller){
}, // 控制器回调
onClear: () {
}, // 点击清空按钮,设置为空时不显示清空按钮
),
控制器
参数初始化
MonthOption({
DateDay currentDay, // 选择的日期
DateMonth currentMonth, // 当前月份
int firstWeek = 7, // 第一列显示的星期 [1,7]
DateDay firstSelectDay, // 连选第一个日期
DateDay secondSelectDay, // 连选第二个日期
bool enableContinuous = false, // 是否支持连选
Map<DateDay, T> marks = const {}, // 标记
List<DateDay>? multipleDays, // 多选日期
List<DateDay>? enableDays, // 能选择的日期集合
bool enableMultiple = false, // 是否支持多选
DateDay minDay, // 可选的最小日期
DateDay maxDay, // 可选的最大日期
});
注销
MonthPageController#dispose();
更新
MonthPageController#reLoad();
下一月
MonthPageController#next();
上一月
MonthPageController#last();
跳转到指定月份
MonthPageController#goto(DateMonth month);

高级功能
自定义
自定义月视图背景
buildMonthBackground: (_, width, height, month) => Image.network(
'https://ssyerv1.oss-cn-hangzhou.aliyuncs.com/picture/b0c57bd90abd49d59920924010ab66a9.png!sswm',
height: height,
width: width,
fit: BoxFit.cover,
),
自定义月视图头部
buildMonthHead: (ctx, width, height, month) => Container(
padding: EdgeInsets.all(5),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Text(
"${month.year}年",
style: TextStyle(fontSize: 40, color: Colors.white),
),
Container(
margin: EdgeInsets.only(left: 5, right: 5),
width: 1,
color: Colors.yellow,
height: 50,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"${month.month}月",
style: TextStyle(fontSize: 18, color: Colors.orange),
),
Text("这是一个自定义的月头部"),
],
)
],
),
),
- 自定义星期头部
- 自定义日视图
- …
![]() |
![]() |
---|
更多功能clone项目,运行demo
开源不易,老铁们多多支持,点赞也是支持 😃 !
示例代码
import 'package:example/calendar_customize.dart';
import 'package:example/calendar_view.dart';
import 'package:example/month_page_view_demo.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_buildButton('年历', CalendarViewPage()),
_buildButton('翻页日历', MonthPageViewDemo()),
_buildButton('自定义', CalendarCustomizePage())
],
),
),
);
}
Widget _buildButton(String label, Widget page) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (ctx) => page)),
child: Text(label),
),
);
}
}
更多关于Flutter日历展示插件mini_calendar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter日历展示插件mini_calendar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用Flutter日历展示插件mini_calendar
的示例代码。这个示例将展示如何集成mini_calendar
插件并在Flutter应用中显示一个简单的日历。
首先,确保你已经在pubspec.yaml
文件中添加了mini_calendar
依赖:
dependencies:
flutter:
sdk: flutter
mini_calendar: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter应用中创建一个页面来展示日历。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:mini_calendar/mini_calendar.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Mini Calendar Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CalendarPage(),
);
}
}
class CalendarPage extends StatefulWidget {
@override
_CalendarPageState createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> {
DateTime selectedDate = DateTime.now();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Mini Calendar Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Selected Date: ${selectedDate.toLocal()}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Expanded(
child: MiniCalendar(
firstDayOfWeek: DateTime.monday, // 设置每周的第一天为周一
initialSelectedDate: selectedDate,
onDateSelected: (date) {
setState(() {
selectedDate = date;
});
},
onDateRangeSelected: (start, end) {
// 如果需要支持日期范围选择,可以处理这个函数
print('Selected Date Range: $start - $end');
},
// 其他可选参数,根据需求配置
// headerStyle: HeaderStyle(
// titleTextStyle: TextStyle(color: Colors.black),
// weekDayTextStyle: TextStyle(color: Colors.grey),
// ),
// dayCellStyle: DayCellStyle(
// selectedColor: Colors.blue,
// todayColor: Colors.red,
// otherMonthColor: Colors.grey[300]!,
// ),
),
),
],
),
),
);
}
}
在这个示例中:
MyApp
是应用的根Widget,它包含一个MaterialApp
和一个CalendarPage
。CalendarPage
是一个有状态的Widget,它包含了一个Scaffold
,AppBar
和一个Column
。Column
中包含一个显示当前选中日期的Text
Widget和一个MiniCalendar
Widget。MiniCalendar
Widget的initialSelectedDate
属性设置为当前日期,并且通过onDateSelected
回调函数来更新选中的日期。
你可以根据需要进一步自定义MiniCalendar
的样式和行为,例如设置headerStyle
和dayCellStyle
等参数。
这个示例展示了如何在Flutter应用中集成和使用mini_calendar
插件来显示一个简单的日历,并处理日期选择事件。希望这对你有所帮助!