22
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FlutterでStatefulWidgetではなくStateにbuild()がある理由

Last updated at Posted at 2018-08-14

はじめに

なぜStatefulWidgetではなくStatebuildメソッドを持っているのか - Qiita」によると、StatefulWidgetbuild()を持たせると、①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」に記載されています。

本ブログでは再描画の範囲限定の観点で見ていきます。

想定

こんなWidgetツリーを考えます。
FlutterのStetefulWidgetの意味.png

考察

再描画のパフォーマンスを考えると、無闇にStatefulWidgetにすべきではなく、また、Stateはなるべく下位のサブツリーに限定すべきとのことです。裏を返すとState更新時にStatefulWidgetを頂点とするサブツリーは全体が再描画(再build())される(可能性がある)ことを意味します。

このあたりは、「StatefulWidget class - widgets library - Dart API」で説明されています。

ここで、Widget同士のhas aの関係を改めて見ると、Stateでサブツリー(点線で囲んだ領域)に分断されていることがわかります。つまり、Stateが変更されても、StatefulWidgetを持つWidgetツリーのbuild()は(必ずしも)呼び出す必要が無く、そのStateが持つbuild()チェーンを呼び出せば、良いということのようです。こうしてみると、とても合理的です。

22
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?