RightonSK / TravelSampleApp

0 stars 0 forks source link

進捗報告 #1

Open RightonSK opened 2 years ago

RightonSK commented 2 years ago

2/9/2022

RiverpodのProvider群の内、ProviderとStateProviderをある程度理解した。

StateProviderのStateのupdate方法を理解した。

明日は、StateNotifierProviderの書き方とfreezedの使い方を学びたい。

freezedは、一つの状態しか持てないstate notifier providerやstate providerのために複数の状態をもつStateクラスを作るためのもの。

色を変更するロジックは、riverpodの勉強会動画にサンプルがあったはずなのでそれを参考にする。

とりあえずpracticeで色と文字を変更するロジックを組みたい。State notifier providerを使って。

RightonSK commented 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が何か分からない。

RightonSK commented 2 years ago

2/11

freezedを用いてState class(model)の作成。そのstateをcontrolするnotifier class(view model)の作成。 それらをpageにて活用することができた。MVVM

その方法でとりあえずmypageのpageを作る。

できるならriverpod × freezedでcoriander appを作成してみたい。

RightonSK commented 2 years ago

2/14

provider×change notifierとriverpod×state notifierの違いに疑問を感じたのでまとめてみる。

上の場合はConsumer widgetを使うのは必須なのか?

RightonSK commented 2 years ago

2/14 疑問点

Scaffoldのbody部分を抜き出したい時に継承しなければならないデータやプロパティは何なのか?

↑ 新しいbody用のクラスを作った方が良い。それならbuild contextとか継承しなくていいので。

RightonSK commented 2 years ago

2/14 端末の大きさによって見え方が変わったりしないのか?

例えばapp barのheightが変わる? 中のIcon Buttonの大きさを固定値にしていたら端末毎に変わってしまうのではないか?

一応、デフォルトのapp barはtool bar heightプロパティで高さを固定できる。

RightonSK commented 2 years ago

stateの値を更新してるのに反映されてない。 何故なのか?

↑ クラスは生成される度に違うオブジェクトなので、マイページで使われているstateと更新ページで使われているstateが同じじゃない。なので、更新ページが参照変更しているstateを変更しても、マイページには反映さえない。

なのでmypageとedit pageでnotifierクラスを分けるのではなくて、統一することにした。 my pageとedit pageで同じnotifierとstateを用いる。

2/14 明日は、firebaseに値を保存し、そこから値を取り出せるようにする。

RightonSK commented 2 years ago

2/20 firebaseとリンクすることができた。

やること: json_serializable を使って fromJson/toJson について理解する。 userクラスをどのように用いて、データをどうやって受け渡すかを考える。

RightonSK commented 2 years ago

json serializationを使うメリットは何なのか?

from json デシリアライズ、to json シリアライズをエンティティ内で定義することによって、repository内でDB(firestore)の型に変換する手間が省ける。

RightonSK commented 2 years ago

2/21 ディレクトリ構造をどうすれば良いか分からない。

presentation ディレクトリに関しては、page毎に各ディレクトリを作ればよい。

repositoryは、どうすれば良いのか? ページ毎に対応するrepositoryを作れば良いのか?

firestore型のデータをentityの形に変えるのは、notifierの中でやるのか?それともrepositoryでやるのか?

RightonSK commented 2 years ago

2/21 今日すること

エンティティにfrom json, to jsonを作る。 それを用いて、firestoreと通信する。

RightonSK commented 2 years ago

my pageを開く際は、user情報を受け渡してもらって、それを処理すれば良いのか

これアプリ起動時にUser情報をProviderに渡すことはできないのか?

RightonSK commented 2 years ago

Widget build(BuildContext context) { return ChangeNotifierProvider( create: (_) => BookListModel()..fetchBookList(),

そもそもこの記法で書けばfetchBookList()は最初のbuild時にしか発火しないのか?

グローバルな変数のproviderにカスケード記法でfetchさせる?それっていつされるんだ?

RightonSK commented 2 years ago

グローバルに定義されたproviderは、最初に使われた時に発火する。 fetch()で値を取得しようとすると、最初にそのproviderを使ってるページを開いた時しかfetch()が発火しない。 そのページに遷移する度にfetch()を発火させるか、 それともstreamを用いて、firestoreの値を常にlistenし続けるか

構造としては、やはりページ毎に対応するnotifierとstateを作りたいので、stateをまとめたstateをnotifierで見てあげれば良い

RightonSK commented 2 years ago

ディレクトリ構造について。 前回までに決めたこと。 一つのpageが一つのnotifier(controller)とstateを持つ。

repositoryはページに対応するものではなく、エンティティに対応するrepositoryの方が良い?

RightonSK commented 2 years ago

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を入れる。