【 Flutter 】Flutter を 基礎 から 学習 ( Flutterの内部構造 ) part217 ライフサイクル

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Flutterの内部構造 ( part217 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Flutterの内部構造 ) part216 ライフサイクル

引き続き、ライブラリについて学びます。

ライフサイクル

StatefulWidget

StatefulWidgetの続きです。
このクラスはとても複雑です。
StatefulWidgetがインスタンス化されると、対応したStatefulElementがインスタンス化されます。
この時点で_MyHomePageStateもインスタンス化されます。
ここまでは理解できます。

StatefulElementWidgetオブジェクトとStateオブジェクト両方を参照していて、Stateオブジェクト自身もWidgeオブジェクトを参照しているという・・。
ドウシテコンナコトニ。

Stateクラスの実装を見てみると,_StateLifecylcleを使用している箇所があります。
これが「ライフサイクル」を意味しているようです。

// たぶんここです。
_StateLifecycle _debugLifecycleState = _StateLifecycle.created;

_StateLifecycleは列挙型になっていてcreated,initialized,ready,defunctが定義されています。defunctは「廃止」という意味です。
まさにライフサイクルですね。
本書ではinitState, didChangeDependencies,disposeは以下のように対応していると説明しています。

  • created★initStateinitialized
  • initialized★didChangeDependenciesready
  • ready★disposedefunct

_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();
  }

 

以下のような結果になりました。

最後に

ドウシテコンナコトニ・・・・

今日はここまで!