はじめに
「なぜStatefulWidget
ではなくState
がbuild
メソッドを持っているのか - Qiita」によると、StatefulWidget
にbuild()
を持たせると、①build()
内のクロージャが、StatefulWidget
の再build()
後も古いStatefulWidget
のインスタンスを参照するthisをキャプチャしてしまうから、②Stateを無用に子クラスに公開しないといけないから、だそうです。このあたりは、「FAQ - Flutter: Why is the build() method on State, not StatefulWidget?」と、そこから参照する「build method - State class - widgets library - Dart API」に記載されています。
本ブログでは再描画の範囲限定の観点で見ていきます。
想定
考察
再描画のパフォーマンスを考えると、無闇にStatefulWidget
にすべきではなく、また、State
はなるべく下位のサブツリーに限定すべきとのことです。裏を返すとState
更新時にStatefulWidget
を頂点とするサブツリーは全体が再描画(再build()
)される(可能性がある)ことを意味します。
このあたりは、「StatefulWidget class - widgets library - Dart API」で説明されています。
ここで、Widget
同士のhas aの関係を改めて見ると、State
でサブツリー(点線で囲んだ領域)に分断されていることがわかります。つまり、State
が変更されても、StatefulWidget
を持つWidget
ツリーのbuild()
は(必ずしも)呼び出す必要が無く、そのState
が持つbuild()
チェーンを呼び出せば、良いということのようです。こうしてみると、とても合理的です。