【 Flutter 】Flutter を 基礎 から 学習 ( Flutterの内部構造 ) part217 ライフサイクル
「 基礎 から 学ぶ Flutter 」という書籍で 学習 したことを ブログでアウトプットしていこうと思います。今回は Flutterの内部構造 ( part217 )です。
前回
【 Flutter 】Flutter を 基礎 から 学習 ( Flutterの内部構造 ) part216 ライフサイクル
引き続き、ライブラリについて学びます。
ライフサイクル
StatefulWidget
StatefulWidget
の続きです。
このクラスはとても複雑です。
StatefulWidget
がインスタンス化されると、対応したStatefulElement
がインスタンス化されます。
この時点で_MyHomePageState
もインスタンス化されます。
ここまでは理解できます。
StatefulElement
はWidget
オブジェクトとState
オブジェクト両方を参照していて、State
オブジェクト自身もWidge
オブジェクトを参照しているという・・。
ドウシテコンナコトニ。
State
クラスの実装を見てみると,_StateLifecylcle
を使用している箇所があります。
これが「ライフサイクル」を意味しているようです。
// たぶんここです。
_StateLifecycle _debugLifecycleState = _StateLifecycle.created;
_StateLifecycle
は列挙型になっていてcreated
,initialized
,ready
,defunct
が定義されています。defunct
は「廃止」という意味です。
まさにライフサイクルですね。
本書ではinitState
, didChangeDependencies
,dispose
は以下のように対応していると説明しています。
created
→★initState
→initialized
initialized
→★didChangeDependencies
→ready
ready
→★dispose
→defunct
_StateLifecycle
の定義の間にそれぞれの処理が挟まっているわけですね。
initialized状態への変化とready状態への変化は_firstBuild
で行われます。
この部分はStatelessWidget
と異なります。
@override
void _firstBuild() {
assert(state._debugLifecycleState == _StateLifecycle.created);
try {
_debugSetAllowIgnoredCallsToMarkNeedsBuild(true);
final Object? debugCheckForReturnedFuture = state.initState() as dynamic; // ★ここでcreated→initializedへと状態が変化している
assert(() {
if (debugCheckForReturnedFuture is Future) {
throw FlutterError.fromParts([
ErrorSummary('${state.runtimeType}.initState() returned a Future.'),
ErrorDescription('State.initState() must be a void method without an `async` keyword.'),
ErrorHint(
'Rather than awaiting on asynchronous work directly inside of initState, '
'call a separate method to do this work without awaiting it.',
),
]);
}
return true;
}());
} finally {
_debugSetAllowIgnoredCallsToMarkNeedsBuild(false);
}
assert(() {
state._debugLifecycleState = _StateLifecycle.initialized;
return true;
}());
state.didChangeDependencies(); // ★ここでinitializedからreadyへと状態が変化している
assert(() {
state._debugLifecycleState = _StateLifecycle.ready;
return true;
}());
super._firstBuild();
}
以下のような結果になりました。
最後に
ドウシテコンナコトニ・・・・
今日はここまで!
ディスカッション
コメント一覧
まだ、コメントがありません