【Flutter】毎日特定のTODOリストを自動生成させる方法

2023/07/25に公開

OB-1で、普通のTODOアプリをアップデートし、ルーティンTODO機能を実装したので、その実装方法を紹介したいと思います。

具体的な実装経験はまだ少ない初心者から中級者の間くらいの方の読者を想定しています。

非常に特定のケースでしか使わない実装ですので、僕が自分で考えた実装例になります。
これが正解だ!というわけでもないので、1つの参考として見ていただければと思います。

アプデ前の仕様

  • TODOは毎日作るという仕様

  • Firestoreのusers/{userId}/projects/{projectId}/todoList/{todoId}という階層にtodoListが保存されている

アプデ後の仕様

  • TODOにお気に入りボタンを設ける

  • お気に入りボタンを押したらFirestoreのusers/{userId}/routines/{routineId}という階層にroutineのTODOを保存する

  • アプリを開いた時に、上記のroutinesのcollectionsを参照し、まだ追加されてなかったら、ルーティンTODOが自動で追加される。(開いた日付に対して)

実装

お気に入りボタンの追加とルーティンcollecitonへの追加

以下の2つの関数を用いて、routineのcollectionには新規追加し、既存のTODOに対してはisRoutineフラグをtrueにするイメージです。

  Future<void> addRoutine({
    required String todoId,
    required String title,
    required DateTime date,
    required int index,
  }) async {
    await routinesCollection.doc(todoId).set(
      {
        "id": todoId,
        "title": title,
        "createdAt": Timestamp.now(),
        "updatedAt": Timestamp.now(),
        "date": Timestamp.fromDate(date),
        "isDone": false,
        "index": index,
      },
    );
  }

  Future updateIsRoutine(
    String todoId,
    bool isRoutine,
  ) async {
    await todoListCollection.doc(todoId).update(
      {
        "isRoutine": isRoutine,
      },
    );
  }

UIの説明は割愛します。

ルーティンcollectionの参照とTODOへの追加

shared_preferenceにアプリを開いた日付を保存しておき、開いた時に、その値が本日じゃなかったらルーティンTODOを今日のTODOに自動追加します。

todoRepoとsharedPrefRepoはそれぞれ、私が作ったtodoコレクションの処理をまとめたクラスと、shared_preferenceの処理をまとめたクラスです。

    // ルーティン取得と追加
    final routineTodos = await todoRepo.fetchRoutines();

    final lastTimeOpened = await sharedPrefRepo.getLastTimeOpened();
    if (lastTimeOpened == null ||
        !DateTime.fromMillisecondsSinceEpoch(lastTimeOpened)
            .isSameDate(DateTime.now())) {
      // まだ今日開いてなかったらルーティンを今日のTODOに追加
      await todoRepo.addRoutinesToTodayTodo(routineTodos: routineTodos);
      sharedPrefRepo.setLastTimeOpened();
    }

以上です!呼んでる関数が基本的に私が作ったもので、中身が不明だと思いますが、実装のイメージが伝われば幸いです!(中身全部書くとコードが膨大になるので割愛します🙇)

まとめ

以上、ルーティンTODOの実装を紹介してみました!
コピペして真似するタイプの記事ではないと思いますが、誰かの実装のヒントになると幸いです。

OB-1を使ってくれると嬉しいです。

https://apps.apple.com/jp/app/id1666271955

GitHubリポジトリで全コード見れます。

Flutter大学に入っているかたはリポジトリが見れます。
https://github.com/flutteruniv/ob-1

Flutter大学はこちら
https://flutteruniv.com/

Flutter大学

Discussion