Open RightonSK opened 2 years ago
2/10
freezedを用いて、State classを作る方法はわかった。file_name_state.dart (model) file_name_notifier.dart (view model)
freezedを用いてstate classを作る時にfactory constructorを用いなければならないが、factoryが何か分からない。
2/11
freezedを用いてState class(model)の作成。そのstateをcontrolするnotifier class(view model)の作成。 それらをpageにて活用することができた。MVVM
その方法でとりあえずmypageのpageを作る。
できるならriverpod × freezedでcoriander appを作成してみたい。
2/14
provider×change notifierとriverpod×state notifierの違いに疑問を感じたのでまとめてみる。
provider, change notifier notifyListeners()でそのmodelのchange notifier providerに信号を送り、consumer widget以下の部分を再描画する。?
riverpod, state notifier providerを監視しそのstateに変更があった場合、その都度再描画する。 Consumer widgetを使えば再描画部分を限定できる。?
上の場合はConsumer widgetを使うのは必須なのか?
2/14 疑問点
Scaffoldのbody部分を抜き出したい時に継承しなければならないデータやプロパティは何なのか?
↑ 新しいbody用のクラスを作った方が良い。それならbuild contextとか継承しなくていいので。
2/14 端末の大きさによって見え方が変わったりしないのか?
例えばapp barのheightが変わる? 中のIcon Buttonの大きさを固定値にしていたら端末毎に変わってしまうのではないか?
一応、デフォルトのapp barはtool bar heightプロパティで高さを固定できる。
stateの値を更新してるのに反映されてない。 何故なのか?
↑ クラスは生成される度に違うオブジェクトなので、マイページで使われているstateと更新ページで使われているstateが同じじゃない。なので、更新ページが参照変更しているstateを変更しても、マイページには反映さえない。
なのでmypageとedit pageでnotifierクラスを分けるのではなくて、統一することにした。 my pageとedit pageで同じnotifierとstateを用いる。
2/14 明日は、firebaseに値を保存し、そこから値を取り出せるようにする。
2/20 firebaseとリンクすることができた。
やること: json_serializable を使って fromJson/toJson について理解する。 userクラスをどのように用いて、データをどうやって受け渡すかを考える。
json serializationを使うメリットは何なのか?
from json デシリアライズ、to json シリアライズをエンティティ内で定義することによって、repository内でDB(firestore)の型に変換する手間が省ける。
2/21 ディレクトリ構造をどうすれば良いか分からない。
presentation ディレクトリに関しては、page毎に各ディレクトリを作ればよい。
provider × change notifierの場合 pageに描画に必要なwidgetsを書き、変動する値をpageからmodelのメソッドを呼び出し、modelにその値を格納した。 それをDBに保存する際は、modelに一時保存されているものをrepositoryに渡し、repository内で保存処理をした。
Riverpod × state notifierの場合 Riverpodもまた、描画に必要なwidgetsなどをpageに書く。変動する値などはnotifierクラスを用いて、stateに格納する。 それをDBに保存する際は、対応するentityクラスにstateの値を格納し、それをrepositoryに渡す。
repositoryは、どうすれば良いのか? ページ毎に対応するrepositoryを作れば良いのか?
firestore型のデータをentityの形に変えるのは、notifierの中でやるのか?それともrepositoryでやるのか?
2/21 今日すること
エンティティにfrom json, to jsonを作る。 それを用いて、firestoreと通信する。
my pageを開く際は、user情報を受け渡してもらって、それを処理すれば良いのか
これアプリ起動時にUser情報をProviderに渡すことはできないのか?
Widget build(BuildContext context) {
return ChangeNotifierProvider
そもそもこの記法で書けばfetchBookList()は最初のbuild時にしか発火しないのか?
グローバルな変数のproviderにカスケード記法でfetchさせる?それっていつされるんだ?
グローバルに定義されたproviderは、最初に使われた時に発火する。 fetch()で値を取得しようとすると、最初にそのproviderを使ってるページを開いた時しかfetch()が発火しない。 そのページに遷移する度にfetch()を発火させるか、 それともstreamを用いて、firestoreの値を常にlistenし続けるか
構造としては、やはりページ毎に対応するnotifierとstateを作りたいので、stateをまとめたstateをnotifierで見てあげれば良い
ディレクトリ構造について。 前回までに決めたこと。 一つのpageが一つのnotifier(controller)とstateを持つ。
repositoryはページに対応するものではなく、エンティティに対応するrepositoryの方が良い?
final messageManager = FirebaseFirestore.instance.collection('messages');
sendMessage() async { final documentId = messageManager.doc().id; final now = DateTime.now(); final insertData = Message( id: documentId, roomId: this.roomId, message: this.message, senderId: this.senderId, isRead: this.isRead, createdAt: now); messageManager.doc(documentId).set(insertData.toJson()); }
先に新しいdocument idを取得して、それを用いて新しいデータをsetする。その時、idプロパティにdocument idを入れる。
2/9/2022
RiverpodのProvider群の内、ProviderとStateProviderをある程度理解した。
StateProviderのStateのupdate方法を理解した。
明日は、StateNotifierProviderの書き方とfreezedの使い方を学びたい。
freezedは、一つの状態しか持てないstate notifier providerやstate providerのために複数の状態をもつStateクラスを作るためのもの。
色を変更するロジックは、riverpodの勉強会動画にサンプルがあったはずなのでそれを参考にする。
とりあえずpracticeで色と文字を変更するロジックを組みたい。State notifier providerを使って。