Flutterウィジェットのライフサイクルの詳細

序文

Android Activityなどの他のビューフレームワークと同様に、flutterのビューウィジェットにもライフサイクルがあり、ライフサイクルのコールバック関数はStateに表示されます。フラッターのライフサイクルを理解することは、合理的な制御を記述するために非常に重要です。コンポーネントの状態のライフサイクルは、次のように編成されています。


 
ウィジェットのライフサイクル

おおまかに3つの段階として見ることができます

  • 初期化(レンダリングツリーの挿入)
  • 状態の変化(Render Treeに存在)
  • 破壊(レンダーツリーの種から削除)

コンストラクター

この関数はライフサイクルに属していません。これは、この時点ではStateのウィジェットプロパティが空であるため、コンストラクターでウィジェットプロパティにアクセスする場合は機能しません。ただし、コンストラクタを最初に呼び出す必要があります。

initState

///このオブジェクトがツリーに挿入されたときに呼び出される
レンダリングツリーに挿入されたときに呼び出される、この関数はライフサイクルで1回だけ呼び出されます。ここでは、状態変数の初期化など、いくつかの初期化作業を実行できます。

didChangeDependencies

///この[State]オブジェクトの依存関係が変更されたときに呼び出されます。

 

 
didChangeDependencies

この関数はinitStateの直後に呼び出され、BuildContext.inheritFromWidgetOfExactTypeを呼び出すことができるため、BuildContext.inheritFromWidgetOfExactTypeの使用シナリオは何ですか?最も古典的なアプリケーションシナリオは

 

new DefaultTabController(length: 3, child: new TabBar( tabs: [ "主页","订单","我的" ] .map( (data)=>new Text(data) ).toList(), 

もともとTabBarはTabControllerを定義する必要がありましたが、DefaultTabControllerのレイヤーを外側に設定してTabContrllerを定義する必要はありません。ソースコードを参照してください。

@override
  void didChangeDependencies() { super.didChangeDependencies(); _updateTabController(); _initIndicatorPainter(); } void _updateTabController() { final TabController newController = widget.controller ?? DefaultTabController.of(context); 

ここに注意してくださいDefaultTabController.of(コンテキスト)

 static TabController of(BuildContext context) { final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope); return scope?.controller; } 

実際、これはBuildContext.inheritFromWidgetOfExactTypeと呼ばれます。つまり、didChangeDependenciesでは、コンポーネント間でデータを取得できます。

didUpdateWidget

///ウィジェットの構成が変更されるたびに呼び出されます。

 

 
didUpdateWidget

コンポーネントの状態が変化すると、didUpdateWidgetが呼び出されます(たとえば、setStateが呼び出されます)
実際、フラッターフレームワークは新しいウィジェットを作成し、この状態をバインドして、古いウィジェットをこの関数に渡します。
この関数は通常、新しいウィジェットと古いウィジェットの比較、変更された属性の確認、および状態の調整に使用されます。
コントローラーの変更に関しては、古いコントローラーリスナーを削除し、この関数で新しいコントローラーリスナーを作成する必要があることに注意してください。
 
TabBar_didUpdateWidget

 
_updateTabController

 

無効にする

///このオブジェクトがツリーから削除されたときに呼び出されます。

この関数は破棄の前に呼び出されます。

廃棄

///このオブジェクトがツリーから完全に削除されたときに呼び出されます。

この段階でコンポーネントは破棄されます。この関数は通常、リスナーを削除し、環境をクリーンアップします。
タブバー:


 
廃棄

実際のシーン

ページAからページBにジャンプするとします。ページAとBのライフサイクルはどうなるでしょうか。

ページBは初期化状態に入り、コンストラクター> initState> didChangeDependencies>ウィジェットビルドの4つの関数を順に実行します。この時点で、ページが読み込まれ、実行状態になります。
このとき、ページAはdeactivate>ビルド機能を順に実行します。現在、ページAはアンインストールされていません。

次に、Bページにボタンが1つだけあると想定します。Bページのボタンをクリックしてボタンのテキストを変更すると、ウィジェットのビルドメソッドが実行されます(理論的には、didUpdateWidgetも実行する必要がありますが、ここにはありません)。

この時点で、「戻る」ボタンをクリックして、ページBからページAに戻ります。
ページAが再び表示され、ページBのアンインストールが開始されます。
次に、Aが最初にdeactivate>ビルドを実行し、次にページBが順次実行されます:deactivate> dispose。
このとき、ページAは実行状態になり、ページBは削除されます。

まとめる

ステージ 呼び出し setStateをサポートするかどうか
コンストラクター 1 いいえ
initState 1 無効(setStateの使用は使用しないのと同じ)
didChangeDependencies > = 1 無効です
didUpdateWidget > = 1 はい
無効にする > = 1 いいえ
廃棄 1 いいえ


著者:ershixiong
リンクします。https://www.jianshu.com/p/762bb2b7fa00
出典:ジェーンの本が
著者によって著作権で保護されています。営利目的の複製については、作者に連絡して承認を得てください。非営利目的の複製については、出典を明記してください。

おすすめ

転載: www.cnblogs.com/xiaochii/p/12709823.html