Open3

Flutter勉強

takithontakithon

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

takithontakithon

Provider周りについて

要は状態管理ツール
以降は話を単純にするために一旦ChangeNotifierに絞る(後述するがChangeNotifierProviderは非推奨)

登場人物

ChangeNotifier

stateを変更を担う
ChangeNotifierをextendsしたりmixinしたりする(基本extendsで、すでに他のクラスをextendsしている場合はmixin、という使い分けでいいという個人の見解)
stateの変更はただ変数を更新するだけでは伝播せず、notifiyListeners()を実行する必要がある

Provider

ChangeNotifierによるstateの変更を伝播させるのが、ChangeNotifierProviderMultiProviderといった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クラスが持つ特定のオブジェクトやフィールドの変更を検知することができる
    ほぼ使わないと思っていいと思うという個人の見解
takithontakithon

addPostFrameCallback

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