検索
[Flutter/dart]StatefulWidgetが親からリビルドされてもcreateState()やinitState()は呼ばれない
- M.R

- 2022年12月30日
- 読了時間: 1分
概要
下記のような一般的なStatefulWidgetがあります。
class childWidget extends StatefulWidget{
State<StatefulWidget> createState() {
return childWidgetState();
}
}
class childWidgetState extends State<childWidget>{
Widget build(BuildContext context) {
//・・・
}
void initState() {
//・・・
}
}このchildWidgetを親Widgetからリビルドした時に、initState()が走ることを期待した処理をinitState()に入れていましたが、どうも最初の1回しか走っていないようです。
原因
WidgetツリーとElementツリーは別物、ということを理解していませんでした。
Flutterは、画面の描画情報をWidget、Element、RenderObjectの3つで管理しています。
このあたりの話は様々なサイトで解説されているのでここでは割愛します。(例えばこのページなど)
簡潔に言うと、リビルドの際は
Widgetが再生成される
Elementは再利用される
そして
createState()、initState()はElement生成時に呼ばれる関数である
ということを踏まえると、原因が分かりますね。
つまり、親からリビルドされてもElementは既存のものが使われるのでcreateState()、initState()は呼ばれない、ということです。
最後に
「Widgetを新しく作ったんだからinitState()も呼ばれるはず」と勘違いしていました
、、、






コメント