株式会社INTSへようこそ
このシリーズの前回の投稿を読んだ後、実際にどのようにwidgetを再構築する方法に疑問を抱いているかと思います。 各widgetには独自のビルド関数があり、頻繁に呼び出されます。 この再構築から完了までの間に、パフォーマンスの何パーセントを消費しましょうか?
これらすべてに答えられるために、Element Tree, Widget Tree と Render Treeを理解する必要があります。そして、Flutterの build(){…}メソッドを実行する方法、画面上の情報を再構築または変更する方法も理解することも必要です。
Flutterは、build(){…} メソッドが呼び出されるたびに、UI全体を再描画または再作成するわけではありません。 それは、詳しく話しましょう。
簡単に言えば、レンダリングされていないelementが画面にレンダリングされます。後の Element (element tree内)には、画面上のRender Object (Render Tree内)へのポインターが作成されます。 また、Widget(Widget Tree内)への、このelementの構成情報を持っているポインターもあります。
build(){…}メソッドは、stateが変化するたびにFlutterによって呼び出されます。基本的に、Flutterの再構築をトリガーする条件は2つがあります。
正確には、setState(){…}を呼び出すと、対応する要素がdirtyとしてマークされます。 毎秒60回行われる次のレンダリングでは、Flutterはbuild(){…}メソッドによって作成された新しい設定情報を確認し、画面を更新します。
DirtyとしてマークされたWidget内にネストされたすべてのWidgetには、新しいwidget/dartオブジェクトが作成されます。 それで、これらすべてのWidgetの新しいバージョンに対応する新しいWidget Treeが作成されます。
Widget Treeが不変なので、新しいWidget Treeが作成されます。つまり、既存のWidgetのプロパティを変更することはできずに、新しいWidgetでオーバーライドできます。 このメソッドは、オブジェクトが変更された時に変更をより効率的に検出できるため、Flutterによって大幅に実装されています。
例:
画面にStateful Widgetが表示されています。 テキスト内にネストされたChild Widgetがあります(Text Widget)。 Text WidgetはStateless Widgetであり、parent widgetのstateに基づいて画面にテキストを表示します。
Stateが変化するとすぐに、表示されるテキストがTrueからFalseに、またはその逆に変わります。GestureDetectorは、Text Widgetのparentです。 そのparentとして、GestureDetectorはsetState () {…}メソッドを呼び出すことで、stateの変更を処理します。
Text Widgetがクリックされるとすぐに、parentがsetStateを処理します。つまり、TestWidgetはdirtyとしてマークされます。Flutterでbuild(){…}メソッドが呼び出されると、新しいWidget Treeが作成されます。
次に、新しいWidget Tree情報が、画面に表示されている実際のコンテンツと比較されます。 Flutterは、コンテナの色が変更されずに、Text Widget内のテキストのみが変更されたことを検出します。 したがって、Render Treeは全てのコンテンツではなく、Text Widget内のテキストのみを表示します。
これはFlutterが効率的に機能する理由です。build(){…}メソッドが呼び出される時に、Element Treeを再構築する必要はありません。Widget Treeのみが再構築され、Element Treeは新しいWidget Treeへの参照を更新するだけです。 次に、Widgetの新しい情報があるかどうかを確認します。新しい情報がある場合は情報をRender Objectに渡して、変更を画面に描画できるようにします。
Logic renderについてもっと読みたい場合は、公式のFlutterドキュメントからこの記事を読んだほうがいいと思います。
クイックコメント
一部のWidgetは、Widget Treeを再構築した後でも変更されないので、ビルドプロセスをさらに最適化できます。 このWidgetが変更されないと通知をFlutterに渡せるために、それらの前にconstキーワードを使用できます。目的はFlutterがそのwidgetの再構築を完全にスキップするようにすることです。
例:
上記では、Padding Widgetの再構築をスキップするようにconstを指定しています。 また、大きなwidgetを小さなwidgetに慎重に分割することで、ビルドプロセスを最適化できます。
結論:
この記事では、Flutter仕様について詳しく説明しました。ここまで、Widgetの再構築プロセスの背後で何が起こっているのかを理解していただければ幸いです。
株式会社INTS 開発部 ハイ・アイン
AI Dialogflow オフショア開発 オフショア開発,人工知能,INTS チャットボット ベトナム・オフショア 人工知能、INTS
Recent Comments