Flutter勉強

最近アプリ側の開発にも興味が出てきたのでいい機会だしインプット内容をメモしておく
書いている情報が古いのは百も承知で、都度自分の必要に応じてアプデしていく

Provider周りについて
要は状態管理ツール
以降は話を単純にするために一旦ChangeNotifierに絞る(後述するがChangeNotifierProviderは非推奨)
登場人物
ChangeNotifier
stateを変更を担う
ChangeNotifier
をextendsしたりmixinしたりする(基本extendsで、すでに他のクラスをextendsしている場合はmixin、という使い分けでいいという個人の見解)
stateの変更はただ変数を更新するだけでは伝播せず、notifiyListeners()
を実行する必要がある
Provider
ChangeNotifierによるstateの変更を伝播させるのが、ChangeNotifierProvider
やMultiProvider
といったProviderたち
単一の状態変化を伝播させるので足りるのであればChangeNotifierProvider
を使えばよく、複数の状態変化を伝播させたい場合はMultiProvider
を使う
※ 上2つは代表例で、他にもいろいろProviderがある. なんならChangeNotifierProvider
は現在は推奨はされていない. 要は他のやつで足りるんやからそれ使えって話
Consumer
Provider
により伝えられるChangeNotifer
の変更を、ウィジェットでsubscribeするために使うことができるのがこれ
使うことが「できる」と書いている通り、subscribeするために必須というわけではない
後述するが、contextを使ってstateの変更を検知する方法もある
context
下位のウィジェットツリーが上位のstateにアクセスする場合、context
を使うこともできる
方法は以下の3種類
-
context.watch
ChangeNotifier
にてnotifyListeners()
が実行されると、context.watch
を使っているウィジェットに対してstateの変更が通知され、そのウィジェットがビルドしなおされる -
context.read
stateの変更は通知されないし検知もしない
なのでnotifyListeners()
が実行されてもウィジェットがリビルドされることはない
context.read
を使用することでstateクラスにアクセスすることができ、stateクラスの関数を実行することができる -
contex.select
context.select((SomeStateClass hoge) => hoge.someField)
のように使うことで、stateクラスが持つ特定のオブジェクトやフィールドの変更を検知することができる
ほぼ使わないと思っていいと思うという個人の見解

addPostFrameCallback
initState後に実行するコールバック関数を登録することができる
initState内ではcontextを参照することができないが、addPostFrameCallback
を使用することでcontextを参照した処理を実行することができるようになる