はじめに
「なぜ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()チェーンを呼び出せば、良いということのようです。こうしてみると、とても合理的です。
