Everything is an “Element”
2021.11.29 (Mon)
FlutterKaigi
@chooyan-eng
自己紹介
中條 剛(ちゅうじょう つよし)
話すこと
Element とは
Elementの役割
Flutter の「内部実装」の話
なぜ内部実装を学ぶのか
なぜ内部実装を学ぶのか
Flutter を学ぶ上で出てくる疑問も自分の頭で答えを出せる
なぜ内部実装を学ぶのか
flutter.dev とフレームワークのコードを読んで
正確な理解を深めよう
デモ:Flutterフレームワークのコードにジャンプする
これだけ
Element とは
Element とは
UIを構築するための「ツリー」を形成するオブジェクト
Widget から生成されるもの (”An instantiation of a Widget”)
Flutter フレームワークの内部実装の大部分を占める
Elementとは ~ Widgetとの比較 ~
Widget
Element
Elementとは ~ ツリー全体のイメージ ~
Widget
Element
RenderObject
StatelessWidget
RenderObjectWidget
StatefulWidget
State
Elementとは ~ 3つのElement ~
ComponentElement
InheritedElement
RenderObjectElement
ツリーを構築するための Element。
build() の結果生成される Widget から Element の親子関係を組み立てる
ツリーの子孫から O(1) でアクセスできる Element
データが変化したらアクセスのあった Element をリビルドする
具体的にレイアウトを計算し画面に描画する RenderObject を管理する Element
Elementの役割
Elementの役割 ~ ツリーのビルド ~
Q: なぜ StatefulWidget の build() は State に定義するのか
ビルド(リビルドも同様)の大まかな流れ
Elementの役割 ~ ツリーのビルド ~
Q: なぜ StatefulWidget の build() は State に定義するのか
1
2
createElement()
Element
build()
3
Elementの役割 ~ ツリーのビルド ~
Q: なぜ StatefulWidget の build() は State に定義するのか
POINT !
A: build() はあくまで Element の仕事で、具体的な処理をどのオブジェクトに移譲するかは Element の具体的な実装次第。と考えられる。
Elementの役割 ~ ツリーのビルド ~
Q: なぜ StatefulWidget の build() は State に定義するのか
StatelessElement
StatefulElement
Elementの役割 ~ 描画の最適化 ~
Q: リビルド範囲・回数は可能な限り絞るべき?
リビルドが伝播するかどうかを決める3つの基準
(「リビルドの伝播」... 子 Element の build() を呼ぶこと)
Elementの役割 ~ 描画の最適化 ~
Q: リビルド範囲は可能な限り狭めるべき?
A: リビルドの範囲や回数よりもリビルドを無駄に伝播させない、Element を無駄に再生成させない工夫が大事。const を使おう!
Elementの役割 ~ ツリーの祖先、子孫へのアクセス ~
Q: .of(context) とは何か。ProviderNotFound エラーはなぜ発生するのか。
POINT !
StatelessElement
StatefulElement
Elementの役割 ~ ツリーの祖先、子孫へのアクセス ~
Q: .of(context) とは何か。ProviderNotFound エラーはなぜ発生するのか。
MyWidget
StatefulElement
見つかった!
Provider
Element
context
MaterialApp
StatefulElement
Elementの役割 ~ ツリーの祖先、子孫へのアクセス ~
Q: .of(context) とは何か。ProviderNotFound エラーはなぜ発生するのか。
MaterialApp
StatefulElement
MyWidget
StatefulElement
context
いくら遡っても Provider は無い!
Provider
Element
Elementの役割 ~ ツリーの祖先、子孫へのアクセス ~
Q: .of(context) とは何か。ProviderNotFound エラーはなぜ発生するのか。
A: .of(context) は Element である context を起点に Element ツリーを祖先方向に走査して目当ての Element を見つけるメソッド(のパターン)。具体的な実装は Widget によって異なる。走査した結果目当ての Element が見つからなかった場合にエラーが発生する。
Case: SharedAppDataを調査する
Case: SharedAppDataを調査する
Case: SharedAppDataを調査する
Case: SharedAppDataを調査する
【結論】
Case: SharedAppDataを調査する
ということは?
詳しくはドキュメントへ
※ 2021.11.19 時点では Web ページ上にドキュメントが存在しないため、ソースコード中のコメントを読むとよさそう。
Case: SharedAppDataを調査する
※注意:
まとめ
何はともあれ F12 を Hit しよう!
Element を知れば Flutter が見えてくる
Flutter が見えてくると Flutter アプリ開発の 楽しさが倍増 する。はず。
あわせて読みたい
Inside Flutter
頑張ればきっと読める
内側から理解する Flutter | Zenn
日本語です。ぜひ。
ご清聴ありがとうございました
引き続きFlutterKaigiを楽しみましょう!