[Flutter/dart]StatefulWidgetが親からリビルドされてもcreateState()やinitState()は呼ばれない
概要
下記のような一般的な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()も呼ばれるはず」と勘違いしていました
、、、
最新記事
すべて表示やりたいこと TextFieldで入力フォームを作りたい。 例えば入力内容が金額の場合、3桁区切りで頭に¥を付けた表記にしたい。 ただしユーザにこれらを入力させるのではなく、ユーザはあくまで数字を入力するだけで、アプリ側で自動でフォーマットしたい。 方法...
現象 やってること iosシミュレータで画像をデバイスのローカルに保存 保存したパスをデータベースに保存 アプリ立ち上げ時にデータベースから画像パスを取得し、そのパスの画像を画面上に表示 起きている現象 iosシミュレータを再起動した場合、上記3で「ファイルパスが見つからな...
やりたいこと 初期値さえ決まればあとは不変な変数がある ただし、コンストラクタ起動時にはまだ決定できない このような変数について late finalで変数を定義 (何らかのタイミングで)初期化されたかどうかをチェックし、されていなければ値を入れる(チェックしないとfina...
Comments