![見出し画像](https://assets.st-note.com/production/uploads/images/34397163/rectangle_large_type_2_f86b51db2fa9e49aa8d368a777802863.png?width=1200)
AIエンジニアが一ヶ月でアプリ開発13:実装④(エラー連発)
こんにちは、りぼっちです。
今日は、実装を進めていきたいと思います。
前回の実装では、けっこうサクサク進んだんですが、今回は何度か詰まったところもあったので、そこを中心に紹介していきます。
Firestore と Provider を使う
こちらは、FirebaseApp の設定をしているので何の問題もありませんでした。ただ単にインスタンスを作るだけです。
ここで Provider の登場です。ChangeNotifier を使って以下のように実装しました。
class DB with ChangeNotifier {
FirebaseFirestore _firestore = FirebaseFirestore.instance;
Future<List> getTasks() async {
.....
return tasks;
}
}
これは Provider を何も分かってなかったんですね。イメージでは、タスクを表示するときに、描画表示終了後に非同期で取ってきて表示するための関数だったんですが、そもそもWEBじゃないんで描画終了後とかの概念がよく分からず、initiarize に非同期で取ってくるような処理を書いたら エラーで怒られました。
結局、いったんプロバイダーの変数に格納して NortifyListner() を呼び出せばよかっただけでした。
class DB with ChangeNotifier {
FirebaseFirestore _firestore = FirebaseFirestore.instance;
List _tasks = [];
List get tasks => _tasks;
Future<List> getTasks() async {
.....
_tasks = tasks;
notifyListeners();
}
}
こんな感じです。実に簡単なのに notifyListeners をいつも忘れてしまう。
更新と画面遷移のタイミング
実は、ログインしているかどうかの状態遷移の処理を以下のようにしていました。
return Consumer<Auth>(
builder: (_, auth, __) {
if (auth.user) return Main();
return LoginPage();
},
);
これでも問題は無いのですが、firebase ログインした瞬間に画面が切り替わっちゃうんですよね。ログイン後にユーザIDを元にユーザ情報を取ってきて shared_preference でユーザ情報をローカルストレージに保存しようとしていたのですが、ユーザ情報を取ってきてる間に画面が切り替わってしまっていたので、実際のログインと画面分岐のフラグを独立させました。
return Consumer<Auth>(
builder: (_, auth, __) {
if (auth.isLogin) return Main();
return LoginPage();
},
);
-------------------
context.read<Auth>().signIn();
gonyo gonyo
context.read<Auth>().changeLoginStatus;
ログインした後に ステータス変え忘れたら、どうしよう。ってか、間の処理でエラーが発生したら、どうしよう。なんて考えなければいけないのですが、note を書いていて、途中の処理も含めて全部 signIn() に入れちゃえばいんじゃない?
う〜ん。モデルとコントローラーの分離の観点ではよく無いような〜。やっぱり、もう一つ抽象度のある階層を挟んだ方が良いのかなぁ〜。っと考えながら、今回はそんなに複雑なアプリじゃないし!いっかぁ!っと見なかったことにしました。
値や引数の引き渡し
普段は、一人で開発してると引数が絶対あることは分かってるのですが、コンピュータは分かりません。そこで、ページ遷移のときの引数など以下のように書いたほうが良いようです。
String projectId = ModalRoute.of(context).settings.arguments ?? "default value";
そうですよね。やっぱり引数とかって必ず渡ってくると思わず、人を疑えっって思います。
最後に
やっぱり画面遷移などが複雑になってくると、データのやりとりと描画の問題で、ちょこちょこエラーを出してしまいました。やっぱりWEBとは、ライフサイクルの感覚が少し違うみたいですね。
今のところ、一通りの機能は動くようになったのですが、例外処理などが不十分だったりUIも、とりあえずで置いてる部分もあるので、まだまだ作り込みが必要そうです。
その前に次回は、広告表示にチャレンジしてみようと思います。副業で稼ぐっていうモチベーションが高いわけではないんですが、とりあえず広告入れてみて、どんな感じなのかを体験してみたいがために広告を入れてみる。(あわよくばテスラ一台買えるくらいの小遣いくらいになれば良いな)