見出し画像

AIエンジニアが一ヶ月でアプリ開発9:実装②

こんちにちは、りぼっちです。

今日は実装の二日目です。

Firebase繋ぎ込み

やり方の詳細については別のブログなどを読めば分かるので、やったことベースで書くと、Firebase に登録して新しくプロジェクトを作成。「burnerlist」というプロジェクトを新規で作りました。

スクリーンショット 2020-09-06 22.40.12

登録したら今回は、とりあえず iOS アプリを作成して「GoogleService-info.plist」というファイルをダウンロードする。このファイルに iOSアプリで Firebaseを使うための API key とかもろもろが入っている。
次にコンソールの 「Authentication 」から「Sign-in method」のタブを開く、今回はとりあえず動くところまでを試したいので「メール/パスワード」を有効にした。パスワードなしでメールだけで認証することもできるみたいだが設定が増えるので、とりあえず今回は無しで進める。

スクリーンショット 2020-09-06 22.50.48

これで Firebase の準備はOK!

FlutterにFirebase の設定を入れる

さきほどダウンロードした GoogleService-info.plist をFlutter の iosというディレクトリ以下にある Runner/Runner の下に入れる必要があるのだが、たんにコンソールでコピーするではダメのようだ。いったん ios以下を xcode で立ち上げた後に、左側のファイルツリーのところにドラッグ&ドロップすると、次のようなメッセージが表示される。

スクリーンショット 2020-09-06 23.07.44

これで初めて登録できるらしい。一番上の「 copy items if needed 」にチェックが入っていると元のファイルも残ったままにしてくれる。これで Finish を押すと xcode の上のメッセージバーみたいなところに indexing と表示されるので、しばらく待つと finish となるので、これでようやく完了。

xcode で登録しなきゃいけないってことを知らずに 一時間近くも時間を溶かしてしまった💦

順調に開発が進んでいたが、、、バグった?

FirebaseAuth の組み込みは順調だった。以下のサイトを参考にしつつ、ガリガリ書いていって、あっという間にログイン完成!

ログインできたー!と思って、次は実機で動かしてみたくなったので、いったん シミュレータのアプリを落とし実機で実行!

NoSuchMethodError: The getter 'status' was called on null.
Receiver: null
Tried calling: status

エラーになって動かない。再度シミュレータで動かしても同じエラー!
ええぇー!さっきまで動いてたじゃん!!!

そう、さっきまでは全てホットリロードで動いていたが、再ビルドしたらロジックが間違ったコードになってました😭

コードを修正

う〜ん。provider の作り方が悪いのかな?それとも instance が出来る前にアクセスされてるのかな?初期値入れてるんだけどなぁ〜。などと色々試しているうちに xcode 側でビルドしてみることにした。すると上記のエラーが出る前に以下のエラーが出ていることに気づく。

[Firebase/Core][I-COR000005] No app has been configured yet.

これや!Firebase App が立ち上がってない。とりあえず status が取得できない理由は分かったけど、FirebaseAppが立ち上がってない理由は分からない。ネットを調べてみると GoogleService-info.plist を再度登録してみるとかあるけど、それ散々やったんだからぁ〜。っと思って試行錯誤。

う〜ん。どうすれば初期化がうまくいくんだろう?

っと思って、ふとFlutterFire の FirebaseAuth の example の初期化の方法を見てみると見慣れないコードと一緒に初期化されていた。

WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();

しかも、もともとMyAppの initState 内で初期化してたけどサンプルでは runApp する前にがっつり await 入れていて、これいいのかぁ〜って感じだった。とりあえず同じように改修してみると、動いたーー!

う〜ん。widgetFlutterBindign はネイティブプラグインを使っている場合は必ず呼ばなきゃいけないらしい。色々パッケージを試行錯誤しているときに入っちゃったのかな?

なにはともあれ上記の改修コードを runApp の直前に入れることで、無事FirebaseApp が立ち上がるようになりました。

最後に

Firebase 自体は簡単なんだけど Flutter 側のデバッグが難しい。ホットリロードでガリガリ実装進めてると、再ビルドしたときに実は動かないってことがあるのは本当に怖い。
あと正式リリースから2年しか経ってないのに、パッケージのインターフェースとかが変わっているものが多くて、すぐに情報が古くなってしまう。それだけ開発が活発だってことなんだろうけど、メンテナンスすると思うと辛いなー。





いいなと思ったら応援しよう!