Flutterアプリを爆速スタートさせるための手順まとめ

#はじめに
Flutterで新規アプリを爆速で作っていきたいと思うけれど、毎度毎度、アプリの土台を作り上げるのに時間がかかってしまう。

最初の流れをテンプレ化できれば、もっと開発に時間が当てれますよね。
という事で、アプリの作りはじめに何をやるかをメモ程度に残していきます。

#手順
現状考えている手順なので、後から書き換えるかもしれないです。
また、アドバイスがあればコメントいただけると幸いです。

##プロジェクト作成
当たり前ですがここから。

## Githubとの連携
僕はほぼほぼGithubを使うので、最初に連携しておきます。
コマンドは以下の順。

```
git init
```

イメージファイルや音声ファイルを使用予定の場合は、Git Large File Storageをインストールしておく。
https://docs.github.com/ja/github/managing-large-files/installing-git-large-file-storage

使用予定のファイルを予め追加しておきます。
png, jpg, ico, mp3など

以下のコマンドで、.gitattributesにGit LFSに関連付けたい種類のファイルを追加していく。
https://docs.github.com/ja/github/managing-large-files/configuring-git-large-file-storage


こちらも参考に
https://qiita.com/takish/items/4b397caa5549a39a8194

```
git lfs install
```


```
git lfs track "*.psd"
```

```
git lfs track "*.png"
```
gitの履歴の容量が大きくなってしまわないようにするためのなので、最初にやっておくべき。

その後、ローカルのプロジェクトをgithubにアップロード。


```
git add .
```

```
git commit -m "Initial Commit"
```

```
git remote add origin リポジトリのURL
```

```
git push -u origin master
```

こちらを参考に。
https://qiita.com/under_chilchil/items/ec9d0050c1e3fb6576de

たまに起こるエラー　**fatal: remote origin already exists.**の対処
https://qiita.com/yu-ki0718/items/3c8aae2c81ca3f82f522

##静的解析の導入
Flutterをやっているといろんな書き方が許容されるので、ルールを最初に設定しておくのがいいと思います。
僕は最初にmonoさん作のパッケージを導入しています。
https://pub.dev/packages/pedantic_mono

後から導入すると、書き換えに労力を多少使うと思うので最初に入れるべき。

## firebaseでプロジェクトを作成
個人開発する場合はfirebaseを使用することが多いと思います。
最初にさっさと作っておきましょう。
https://firebase.google.com/docs/flutter/setup?hl=ja
こちらを参考に。

firebaseを使う際に、使用するかもしれないパッケージリストはこちら。
https://firebaseopensource.com/projects/firebaseextended/flutterfire/


##ユーザーログインの確認 （firebase Auth）
データを保存するために、firestoreを使うことが多いですが、そこでuserId毎にデータを保存することが多いです(経験上)。
userIdが必要なら、先に認証系を作っておくと作業効率がいい気がする。
こちらのドキュメントを参考に。
https://firebase.flutter.dev/docs/auth/usage/


##firestoreの導入
ようやくここでfirestoreを導入。
先ほどの認証により取得したuid(userId)を使用し、ユーザーごとのデータを保存。
firestoreの導入はこちらのドキュメントを参考に。
https://firebase.google.com/docs/flutter/setup?hl=ja
firebaseの導入から紹介してくれてます。

##アプリのテーマの設定
デザインなどが既にあるのならば、よく使う物をテーマに設定しておくべきですね。
カラー、テキスト、その他Widgetのデフォルトテーマを設定しておきましょう。
公式ドキュメントが参考になると思います。
https://flutter.dev/docs/cookbook/design/themes
頑張って英語は読めるようにしたほうがいいです。

##モデルクラスの自動作成準備
以下のパッケージを使用します。
https://pub.dev/packages/json_serializable
https://pub.dev/packages/json_annotation
https://pub.dev/packages/build_runner

モデルクラスをbuild_runnerを使って自動生成すると便利です。
jsonのシリアライズ・デシリアライズ処理のコードを自動生成してくれます。

以下は一例ですが、
**1.jsonからPhraseオブジェクトに変換する。(fromJson)**
**2.Phraseオブジェクトをjsonに変換する。(toJson)**

部分のコードを勝手に用意してくれます。
firestoreにデータを保存するのなら、オブジェクトのままは保存できないです。
結局json形式にして保存しないといけないので、build_runnerは超便利。

```dart

import 'package:json_annotation/json_annotation.dart';

part 'phrase.g.dart';

@JsonSerializable()
class Phrase {
  Phrase();

  factory Phrase.fromJson(Map<String, dynamic> json) => _$PhraseFromJson(json);

  Map<String, dynamic> toJson() => _$PhraseToJson(this);

  String jaPhrase;
  String enPhrase;
  String listType;
}

```

ちなみに、build_runnerを走らせるコマンド

```
flutter packages pub run build_runner build
```
は暗記するべきです。
よく使うので毎回ググる・メモからコピペするより、暗記するべきコマンドだと思っています。

参考記事
https://qiita.com/kitoko552/items/81168294f5738175ff1d


##状態管理方法の選定
ここら辺からは、手順に入れるものなのかな？と思いつつ書いてます。
公式ドキュメントに、いろいろな状態管理方法が記述してあります。
https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

**setState => BLoC / Rx => Provider => Riverpod**
と流行りは移っているようですが。
Flutterの状態管理法はいろいろあってどれを使えばいいんだ！って感じですが、やはり最新のものほどコードもすっきりしてると思います。

初心者のstate管理の練習程度のプロジェクトであればsetStateでもいけると思います。
大きいプロジェクトになると、BLoC、Provider、Riverpodあたりが必要かもですね。

ProviderやRiverPodを作った方は天才ですね。。
https://twitter.com/remi_rousselet

#まとめ
いかがでしたでしょうか。
この記事のように、手順を視覚化しておくだけで、かなり効率が上がると思います。
アプリ・カラーのテーマは大枠は使いまわせると思います。(もちろん詳細部分は違う)
また、自分で作ったカスタムWidgetも、どのアプリでも使いまわせそうなものは、分けておいてコピペするのが効率がいいかな。

また何かあったら追記するかもしれません。
アドバイス・コメントをお待ちしております。