序文
Android Activityなどの他のビューフレームワークと同様に、flutterのビューウィジェットにもライフサイクルがあり、ライフサイクルのコールバック関数はStateに表示されます。フラッターのライフサイクルを理解することは、合理的な制御を記述するために非常に重要です。コンポーネントの状態のライフサイクルは、次のように編成されています。
おおまかに3つの段階として見ることができます
- 初期化(レンダリングツリーの挿入)
- 状態の変化(Render Treeに存在)
- 破壊(レンダーツリーの種から削除)
コンストラクター
この関数はライフサイクルに属していません。これは、この時点ではStateのウィジェットプロパティが空であるため、コンストラクターでウィジェットプロパティにアクセスする場合は機能しません。ただし、コンストラクタを最初に呼び出す必要があります。
initState
///このオブジェクトがツリーに挿入されたときに呼び出される
レンダリングツリーに挿入されたときに呼び出される、この関数はライフサイクルで1回だけ呼び出されます。ここでは、状態変数の初期化など、いくつかの初期化作業を実行できます。
didChangeDependencies
///この[State]オブジェクトの依存関係が変更されたときに呼び出されます。
この関数は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が呼び出されます(たとえば、setStateが呼び出されます)
実際、フラッターフレームワークは新しいウィジェットを作成し、この状態をバインドして、古いウィジェットをこの関数に渡します。
この関数は通常、新しいウィジェットと古いウィジェットの比較、変更された属性の確認、および状態の調整に使用されます。
コントローラーの変更に関しては、古いコントローラーリスナーを削除し、この関数で新しいコントローラーリスナーを作成する必要があることに注意してください。
無効にする
///このオブジェクトがツリーから削除されたときに呼び出されます。
この関数は破棄の前に呼び出されます。
廃棄
///このオブジェクトがツリーから完全に削除されたときに呼び出されます。
この段階でコンポーネントは破棄されます。この関数は通常、リスナーを削除し、環境をクリーンアップします。
タブバー:
実際のシーン
ページ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
出典:ジェーンの本が
著者によって著作権で保護されています。営利目的の複製については、作者に連絡して承認を得てください。非営利目的の複製については、出典を明記してください。