【個人開発】“誰かの作ったリスト”が使える！最強のチェックリストアプリを作りました！！


旅行の準備リスト、引っ越しのやることリスト、出産準備リスト
…など、イベントがあるたびに、同じようなリストをイチから作っていませんか？

> **「もう誰かが作っているリストがあるなら、
　それをコピーして使えたら超ラクなのに…！」**

そんな発想から生まれたのが、
僕が考えた最強のチェックリストアプリ **vLIST** です！

この記事では、vLISTの特徴や技術的なポイントをご紹介します。
<br>

vLISTは**Android/iOS両対応**なので、ぜひ一度お試しください！

　Apple：https://apps.apple.com/us/app/vlist/id6742484311
　Google：https://play.google.com/store/apps/details?id=com.eijirou.vlist

## このアプリは誰向け？ 何が解決できる？

＜対象＞
　旅行や引越しなどイベントごとに「やること／持ち物リスト」を作ることが多い方
　子どもが産まれるなど、これからイベントが増える方

＜解決できること＞
　他のユーザーが作成したリストを検索＆ダウンロードできるので、
 　自分用に編集 → 時間と手間を大幅に削減！

＜こんな時に便利＞
　リストを作る時間がないという場面でも、既存リストをすぐ流用できる時短に
　「誰かの知見を活用したい」「抜け漏れを防ぎたい」 なら、最強の味方になります


## なぜ「ToDo」ではなく「チェックリスト」アプリなのか？
ToDoとチェックリストの個人的な位置付けはこんな感じ

- **ToDoアプリ**  
  - タスク管理や「誰が」「いつまでに」「どこで」など付加情報を扱いたい
  - 日々のスケジュール管理や優先度付けに適している
    <br>

- **チェックリストアプリ**  
  - **一つのテーマに必要な項目を全部リストアップして確認**するのが目的
  例えば、"旅行で必要な持ち物一覧", "イベント準備で必要なことリスト」など
  - スケジュール管理というより「何が必要か」とか「抜け漏れ防止」にのため
    <br>

ToDoアプリは山ほどあっても、**チェックリストに特化**したアプリは案外少なく
テーマ別にリスト作成できるアプリを開発することに至りました。


## みんなが作った「イベント別チェックリスト」を共有したい

元々は出産に合わせたリストを楽に作成したいことがきっかけでしたが、
ネットで"チェックリスト"を調べてみると、他にも使いどころがありそうでした。

例えば…
- 「引越しの際の役所手続きや荷造りリスト」
- 「コミケ準備に必要なもの」
- 「資格試験の対策リスト」
…など
    <br>

SNS（Xやインスタ）で検索すると、画像や文字ベースでシェアされている
チェックリストはたくさん見つかります。 

しかし、それを自分用のリストとして流用するには、
**手打ちで写すか、別の手段でコピー**しないといけなくて面倒でした…

このアプリを使えば、
　**作った人はチェックリストを公開！**
　**使う人は検索 → DL で即利用可能！**  

「誰かが使ったリストをそのまま活用できる」その便利さがこのアプリにはあります！
特に初めてやることなら、誰かがまとめたリストを参考にしたい。


## アプリの紹介

vLISTで提供している機能は主に３つです。
<br>

**１.基本のチェックリストの作成機能**

| <br>《主な機能》<br>・ チェックリストのタイトルと詳細情報を設定できる<br>・ リストの追加、削除、並び替え<br>・ サブリストの追加、別のリストへ移動も可能<br><br>《セールスポイント》<br>・ メモや補足情報を書けるのは珍しいかも<br>　 注意書きや、記号の凡例の記載などに利用<br>・ １ページ内で階層（サブリスト）での管理が可能<br>　 分類とかに使えて何かと便利！<br>　　　　　　　　　　　　　　　　　　　　　　　　　　 | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/f1172278-16eb-453f-97e6-94cd53566807.gif" width="200px"> |
| --- | --- |


**２. チェックリストの共有機能**  
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/aeb41b43-c69a-4a7d-895d-8a8716d6e510.png" width="200px"> | 《主な機能》<br>・ 友達や家族とリストを共有して編集できる<br>・ 基本操作は個人用のものと同じ<br>・ 現在の参加者の表示も可能<br><br>《セールスポイント》<br>・ ログイン不要で利用可能<br>　 ただし名前の設定はログイン必要<br>　　　　　　　　　　　　　　　　　　　　　　　　　　 |
| --- | --- |

**３. チェックリストの公開機能**  
| 《主な機能》<br>・ 自分が作成したチェックリストを公開<br>・ 公開されたチェックリストを検索してDL可能<br><br>《セールスポイント》<br>・全て<br>　　　　　　　　　　　　　　　　　　　　　　　　　　 | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/0b92e244-d8a6-41b8-a1a3-f66675d64f75.gif" width="200px"> |
| --- | --- |

---

### 技術的なこと

- **フロントエンド**: **Flutter (Dart)**
  - 1つのコードベースでAndroid/iOS両対応できるため採用
  <br>

- **ローカルDB**: **Drift**
  - 当初はIsarを使っていましたが、更新頻度の問題で最終的にDriftへ
  <br>

- **クラウドDB**: **Firebase Realtime Database / Firestore**
  - 共有機能 → Realtime Database
  - 公開機能 → Firestore（検索処理はベクトル検索）
  <br>

- **リンク共有**: Appsflyer
  - 当初はFirebaseのDynamicLinksで検討、しかしサ終予定のためAppsflyerを採用
  <br>

---

### 実装で苦労したところ

#### 1. Firebase料金の節約

- Firebaseは使いやすい反面、「アクセス数」や「データ量」に応じて課金されます。  
そこで、以下のような対策を実施しました。

  1. フィールド名をできるだけ短く。基本１文字
  2. クライアントで判定または算出できる情報はクラウドに保存しない
  3. Bundleデータを作成して読み取り回数を削減
  4. 基本はキャッシュによるデータ取得を意識

今回は文字データのみ使用しているため、そんなにデータ量は多くなりませんが
勉強 ＋ 今後何を実装するか分からないため、設計段階から気を配りました。

#### 2. チェックリスト管理（ローカル・共有・公開）の切り分け

それぞれの機能で、チェックリストを保存している場所が違うため、
情報を紐づける必要があったのですが、何でどこに情報を保有すべきか悩みました。

- **自分用リスト**: Driftに保存
- **共有リスト**: RealTimeDBに保存
- **公開リスト**: Firestoreに保存


特に**共有リスト**はリアルタイム同期が必要なので、
ローカルDBとの二重管理をどう制御するかが、悩みどころでした。

#### 3. 共有チェックリストのリアルタイム更新

当初は「ホストは自分が更新を行う際にローカルDBも同時に更新する必要がある」
と考えていましたが、RealTimeDBは**自分が更新した変更のイベントも届く**
ということを知り、実装がかなりシンプルになりました。

ホストも含めた全参加者は更新時にRealTimeDBを更新し、
ホストはイベントが届いた時のみローカルDBを更新すればよくなりました。

---

## 最後に

ユーザー投稿型アプリの難点なのですが、
まだこのアプリに掲載されているチェックリストが少ないです。

- 「自分の考えたリストを広めたいけど、広める場所がない」
- 「すごいチェックリストを持っているけど自分しか使ってない」

そんな素晴らしいチェックリストをお持ちの方は、
ぜひ vLIST でリストを公開していただけるととても嬉しい。

<br>

今後も**アップデートや機能追加**を行う予定です。
まだ発展途上のアプリですが、ぜひフィードバックをいただけると幸いです。

- この記事やアプリへのご意見などはコメントで！（大歓迎です🎉）
- **いいね**していただけると開発の励みになります！

<br>
最後までお読みいただき、ありがとうございました！