iOSアプリ開発(Swift)に挑戦する前、実は一足先にFlutter/Firebaseで個人開発アプリを1つ作った経験があります。友人や家族と旅行の計画を共有できるアプリで、行程をみんなで組んだり、チャットでやり取りしたりできる機能を実装しました。
この記事では、その開発を通じてつまずいたポイントを、初心者目線で振り返ります。
Firebaseの「リアルタイム更新」の感覚をつかむまでが大変
FirestoreはStreamBuilderなどを使うと、データが更新されるたびに画面が自動的に再描画される「リアルタイム更新」が簡単に実現できます。便利な反面、最初は次のようなところでつまずきました。
- どのウィジェットをStreamBuilderで囲むべきか分からず、画面全体を再描画してしまいカクつく
- 一覧表示と詳細表示の両方でリスナーを張ってしまい、無駄な読み込みが発生する
- リスナーの解除(dispose)を忘れて、画面を閉じた後も裏で更新が走り続ける
「とりあえず動くけど、なぜ動いているか分かっていない」状態になりやすい部分だと感じました。必要な範囲だけを絞ってリアルタイム更新の対象にする、という意識を持てるようになるまで、何度も書き直すことになりました。
Firestoreのデータ構造設計で何度もやり直した
行程データとチャットデータをどう保存するか、最初の設計で何度も迷いました。
- 旅行1件ごとにコレクションを分けるべきか、1つの大きなコレクションにまとめてフィールドで絞り込むべきか
- チャットのメッセージを、旅行データのサブコレクションにするか、独立したコレクションにするか
- 行程を並び替える機能(ソート機能)を作る際、順序をどう保存するか(配列のインデックスで持つか、各アイテムに順序番号を持たせるか)
特に行程のソート機能は、並び替えた結果をFirestoreにどう反映するかで一度設計をやり直しました。各アイテムに「順序番号」を持たせておき、ドラッグ&ドロップで並び替えた際にその番号だけを更新する形に落ち着きましたが、最初は配列そのものを毎回丸ごと書き換える設計にしてしまい、データ量が増えると動作が重くなる問題に直面しました。
セキュリティルールを後回しにして苦労した
開発序盤は「とりあえず動かしたい」という気持ちが先に立ち、Firestoreのセキュリティルールを開発用の緩い設定(誰でも読み書き可能)のまま進めてしまいました。
後になって、実際に他のユーザーとデータを共有する機能(チャットや行程の共同編集)を作る段階になって、「このユーザーは旅行の参加者か」「このメッセージの送信者は本人か」といった権限チェックを一気に設計する必要が出てきて、想定より時間がかかりました。
共有・共同編集の機能があるアプリを作るなら、セキュリティルールは後回しにせず、早い段階から意識しておくべきだったというのが率直な反省点です。
非同期処理(async/await)の扱いに慣れるまで
FlutterではFutureやasync/awaitを使った非同期処理が頻繁に登場します。特に以下のような場面で、最初はエラーの原因がつかめず苦労しました。
- 画面がまだ表示されているかどうか(
mountedチェック)を確認せずに非同期処理後にsetStateを呼び、エラーが出る - 複数の非同期処理を順番に実行すべきところを、並行実行してしまいデータの整合性が崩れる
- ローディング中の状態管理を忘れ、データ取得前に空の画面が一瞬表示されてしまう
これらは「エラーメッセージを読んでも最初は何が起きているか分からない」タイプのつまずきで、似たようなエラーに何度も遭遇しながら少しずつパターンを覚えていきました。
それでも「作り切れた」ことが一番の収穫
つまずいた点を並べると大変そうに見えますが、行程のソート機能とチャット機能を実際に完成させて、家族や友人と使えるところまで持っていけたのは、大きな自信になりました。
Swift学習との比較
現在挑戦しているSwift(iOSアプリ開発)と比較すると、Flutterは1つのコードでiOS・Android両方に対応できる手軽さがある一方、Firebaseのようなバックエンドサービスとの連携部分でつまずきやすいと感じています。Swiftの学習ではまずは文法・UI周りでつまずくことが多く、つまずきの種類が少し違う印象です。
まとめ
- リアルタイム更新は「必要な範囲だけ」に絞る意識が大事
- データ構造設計は、後からの機能追加を見越して早めに固めておく
- セキュリティルールは開発の後回しにせず、早い段階から意識する
- 非同期処理のエラーは、パターンを覚えていくしかない
次回は、実際に「ビルドが失敗しました」というエラーで心が折れかけた話と、その解決法をまとめます。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント