どうも、ちょげ(@chogetarou)です。
2つの連動したカレンダーを表示する方法を紹介します。
方法

インポート
まず、必要なパッケージをインポートします。
import 'package:syncfusion_flutter_calendar/calendar.dart';
import 'package:flutter/scheduler.dart';
コントローラと関数の用意
次に、カレンダーを連動させるために必要なコントローラと関数を用意します。
CalendarController _calendarController1 = CalendarController();
CalendarController _calendarController2 = CalendarController();
void calendar1ViewChanged(ViewChangedDetails viewChangedDetails) {
SchedulerBinding.instance!.addPostFrameCallback((Duration duration) {
_calendarController2.displayDate = DateTime(
_calendarController1.displayDate!.year,
_calendarController1.displayDate!.month + 1,
_calendarController1.displayDate!.day);
});
}
void calendar2ViewChanged(ViewChangedDetails viewChangedDetails) {
SchedulerBinding.instance!.addPostFrameCallback((Duration duration) {
_calendarController1.displayDate = DateTime(
_calendarController2.displayDate!.year,
_calendarController2.displayDate!.month - 1,
_calendarController2.displayDate!.day);
});
}
コントローラは、カレンダーを操作するためのものです。
上記で用意している2つの関数は、カレンダーのスクロールを連動させるためのものです。
カレンダーを表示
最後に、カレンダーを表示します。
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
SfCalendar(
view: CalendarView.month,
controller: _calendarController1,
monthViewSettings: MonthViewSettings(
navigationDirection: MonthNavigationDirection.vertical,
),
onViewChanged: calendar1ViewChanged,
),
SfCalendar(
view: CalendarView.month,
controller: _calendarController2,
viewHeaderHeight: 0,
monthViewSettings: MonthViewSettings(
navigationDirection: MonthNavigationDirection.vertical),
onViewChanged: calendar2ViewChanged,
),
],
),
);
}
それぞれのカレンダーに、コントローラと関数を指定します。(コントローラは「controller引数」、関数は「onViewChanged引数」)
これで連動した2つのカレンダーが表示されます。
完成形
CalendarController _calendarController1 = CalendarController();
CalendarController _calendarController2 = CalendarController();
void calendar1ViewChanged(ViewChangedDetails viewChangedDetails) {
SchedulerBinding.instance!.addPostFrameCallback((Duration duration) {
_calendarController2.displayDate = DateTime(
_calendarController1.displayDate!.year,
_calendarController1.displayDate!.month + 1,
_calendarController1.displayDate!.day);
});
}
void calendar2ViewChanged(ViewChangedDetails viewChangedDetails) {
SchedulerBinding.instance!.addPostFrameCallback((Duration duration) {
_calendarController1.displayDate = DateTime(
_calendarController2.displayDate!.year,
_calendarController2.displayDate!.month - 1,
_calendarController2.displayDate!.day);
});
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
SfCalendar(
view: CalendarView.month,
controller: _calendarController1,
monthViewSettings: MonthViewSettings(
navigationDirection: MonthNavigationDirection.vertical,
),
onViewChanged: calendar1ViewChanged,
),
SfCalendar(
view: CalendarView.month,
controller: _calendarController2,
viewHeaderHeight: 0,
monthViewSettings: MonthViewSettings(
navigationDirection: MonthNavigationDirection.vertical),
onViewChanged: calendar2ViewChanged,
),
],
),
);
}
コメント