[flutter]SfCalendarの基本的な使い方まとめ

## はじめに

flutterでカレンダーを使用する際には[tale_calendar](https://pub.dev/packages/table_calendar)が紹介されがちですが、今回のプロジェクトでの要件を満たすために[SfCalendar](https://pub.dev/documentation/syncfusion_flutter_calendar/latest/calendar/SfCalendar-class.html)を使用したので、基本的な使い方を紹介します。


## SfCalendar導入

```dart:import
dependencies:
  flutter:
    sdk: flutter
  syncfusion_flutter_calendar: ^22.1.38 //追加
```

最新のバージョンは[公式ドキュメント](https://pub.dev/packages/syncfusion_flutter_calendar/install)から確認してください。



## ミニマムコード

```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month,
  ));
}

```

上記コードではviewのパラメータはそれぞれ、

>+ CalendarView.month → カレンダー月表示![スクリーンショット 2023-07-17 15.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/637a947d-5f02-bf81-75e9-4afc3f17cadc.png)

>+ CalendarView.day → カレンダー曜日表示
![スクリーンショット 2023-07-17 15.48.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/687ec0a2-ad33-8ec4-3323-15d5fedd17ff.png)

>+ CalendarView.week → カレンダー週表示![スクリーンショット 2023-07-17 15.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/fc3617f3-4de0-be01-234a-5cbed63c92db.png)

他にもありますが、他のviewの形式は実際に触って確かめてみてください。

## その他主要パラメータ

### todayHighlightColor

※今回は月表示を前提として進めます。


```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,///new

  ));
}

```
todayHighlightColorで今日の日付をハイライトするcolorを選択します。


### showNavigationArrow

```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,
showNavigationArrow: false,///new

  ));
}

```
showNavigationArrowでは、次、前月にスクロールする際にナビゲーションを表示するかを制御するパラメータになります。


### selectionDecoration

```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,
showNavigationArrow: false,
selectionDecoration: BoxDecoration(
            color: Colors.transparent,
            border: Border.all(color: Colors.transparent,width: 0),),
///new

  ));
}

```

selectionDecorationでは、任意の日付をタップした際の色を決定します。
※上記コードでは選択時に色をつけない仕様にしています。

### headerStyle


```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,
showNavigationArrow: false,
selectionDecoration: BoxDecoration(
            color: Colors.transparent,
            border: Border.all(color: Colors.transparent,width: 0),),

headerStyle: const CalendarHeaderStyle( textAlign: TextAlign.center),///new

  ));
}

```

ヘッダーのテキストを修飾するロジックです。
※上記コードではヘッダーのテキストをセンターに配置しています。

### appointmentDisplayCount

```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,
showNavigationArrow: false,
selectionDecoration: BoxDecoration(
            color: Colors.transparent,
            border: Border.all(color: Colors.transparent,width: 0),),

headerStyle: const CalendarHeaderStyle( textAlign: TextAlign.center),

 appointmentDisplayCount:4///new

  ));
}

```

appointmentDisplayCountでは一つの曜日に表示できるイベント数の最大数を指定できます。

端末サイズによって三項演算子とうで場合分けして使用すればいい感じになりそうです。

### onViewChanged&onTap

```dart
@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
todayHighlightColor: Colors.orangeAccent,
showNavigationArrow: false,
selectionDecoration: BoxDecoration(
            color: Colors.transparent,
            border: Border.all(color: Colors.transparent,width: 0),),

headerStyle: const CalendarHeaderStyle( textAlign: TextAlign.center),

 appointmentDisplayCount:4

  onViewChanged: (ViewChangedDetails details) {
                           print(details.visibleDates)

                        },///new

 onTap: (CalendarTapDetails details) {
                          print(details.visibleDates)
                        },///new

  ));
}

```
 

onViewChangedでは前、次スクロールした際のロジックを記載できます。

onTapは文字通りタップした際のロジックを記載できます。


## 全コード

```dart

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';

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

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, });


 

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
 

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: SfCalendar(
    view: CalendarView.month
    todayHighlightColor: Colors.orangeAccent,
    showNavigationArrow: false,
    selectionDecoration: BoxDecoration(
            color: Colors.transparent,
            border: Border.all(color: Colors.transparent,width: 0),),

   headerStyle: const CalendarHeaderStyle( textAlign: 
    TextAlign.center),

   appointmentDisplayCount:4

   onViewChanged: (ViewChangedDetails details) {
                             print(details.visibleDates)

                        },

   onTap: (CalendarTapDetails details) {
                          print(details.visibleDates)
                        },

  ));
}}
```