0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

各言語でカレンダー作成

Last updated at Posted at 2023-08-15

きっかけ

  • Flutterを利用してクロスプラットフォームなアプリ開発。カレンダーを描画したい。
  • カレンダー画面の作成は一苦労。
    • 当該月の始まりと終わりの日にち
    • 週の始まりは日曜なのか月曜なのか
    • 週の中に先月の日付や来月の日付が含まれる場合はどうするか。
  • ライブラリやパッケージを駆使するのも良いが、デザインの縛りがあったりでカスタマイズがしずらい。
  • 後々、様々な言語でカレンダー画面を作成する可能性がある為、それぞれの言語へ翻訳しておきたい。

コーディング開始

Flutterバージョン

1. データ生成だけを行うクラスを作成

月を指定して上記の一苦労ポイントを抑えて日にちのリストを生成する。

githubにて全てのコードを確認できます。

calendar_generator.dart
//...前略
// 週の始まりが日曜日と月曜日のどちらかは、利用する親Widgetで指定する
late bool startFromMonday;

// 指定する日付を引数に、その日付の属する1ヶ月分の日付をリストで返す
List<List<int?>> build(DateTime date){
    // some codes
}
//...後略

2023年8月の場合↓

CONSOLE
[[30, 31, 1, 2, 3, 4, 5],
 [6, 7, 8, 9, 10, 11, 12],
 [13, 14, 15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24, 25, 26],
 [27, 28, 29, 30, 31, 1, 2]]

2. 生成されたデータを描画するWidgetを作成

完成イメージ

calendar view

描画のアプローチ

  • 数値のリスト(2次元配列)の構成: List<List<int?>>

    • 1週間分の7つの数値
      • 前月の日を含む週
      • 含まない週
      • 翌月の日を含む週
  • 配列内の一つの配列を横に並べて、翌月の日を含む週の配列まで縦に並べて行く。

  • 後はStackColumnTableウィジェットを使ってレイアウトする。

大まかなWidget Tree

`MainApp`
v MainApp
  v Scaffold
    v Column
      v Container
        v CalendarWidget // ここから`calendar_widget`
          v Container
            v Stack
              - Text
            v Column
              v Table
                - Text
                ...
              v Table
                v Padding
                  - Text
                ...

TypeScriptバージョン

翻訳作業中


更新履歴

No. 日付 内容
2 2023/8/24 Flutterコーディングの各項目に詳しい思考過程を追記
1 2023/8/15 初稿
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?