【Flutter】StatefulWidgetのライフサイクル
はじめに
Flutterにおける StatefulWidget
のライフサイクルについて解説します。
Flutterのライフサイクルは、
- アプリ(
AppLifecycleState
) - 画面(
StatefulWidget
)
の2種類がありますが、今回はStatefulWidget
のライフサイクルについて解説します。
[参考記事]
StatefulWidgetのライフサイクル
ライフサイクルの状態遷移図は以下の通りです。
グレーの四角がStatefulWidget
の状態遷移時に呼ばれるメソッドです。
それ以外がStatefulWidget
の状態名です。
StatefulWidget
の状態は、created
・initialized
・ready
・defunct
の4種類となります。
created
StatefulWidget
のcreateState
メソッドによりcreated
状態になります。
そして、created
状態になった後に、initState()
が呼び出されます。
initState
はWidgetの初期化時に一度だけ呼ばれるメソッドです。
void initState() {
super.initState();
// todo: ここに処理を書きます
}
initialized
initState()
の後、initialized
状態に遷移します。
initialized
状態になった後に、didChangeDependencies()
を呼び出します。
didChangeDependencies()
はStateオブジェクトの依存関係が変更されたときに呼び出されるメソッドです。
void didChangeDependencies() {
super.didChangeDependencies();
// todo: ここに処理を書きます
}
ready
didChangeDependencies()
完了後、ready状態に遷移します。
初回はbuild()
がすぐに呼び出され、ウィジェットが構築されます。
setState()
を行うことで、強制的にウィジェットの再構築を行われ、build()
が再び呼び出されます。
また、親ウィジェットが再構築された場合、didUpdateWidget()
が呼び出されます。
この後にウィジェットの再構築(build()
)が行われます。
それ以外の更新処理については、didUpdateWidget()
に処理を書きます。
void didUpdateWidget(MyHomePage oldWidget) {
super.didUpdateWidget(oldWidget);
// todo: ここに処理を書きます
}
defunct
ウィジェットが完全に破棄された状態です。
この状態の前にdispose()
が呼び出されます。
具体例として、dispose()
にはサービスの終了に関する処理を記載したりします。
void dispose() {
// todo: ここに処理を書きます
super.dispose();
}
まとめ
StatefulWidget
のライフサイクルの流れについて理解できたと思います。
(created → initialized → ready → defunct)
StatefulWidget
ではinitState()
やsetState()
、dispose()
を使用することが多いので、それ以外(didChangeDependencies
やdidUpdateWidget
)についてはあまり意識しなくて良いと思います。
Discussion