SizedBox と Contaiiner の違い
はじめに
FlutterでUIを作る際にSizedBoxとContainerを混在して使用しており、両者はどのように違うのか明確に意識せずに使っていたので違いをまとめてみました。
実用上の違い
機能の違い
SizedBoxはwidth,heightを設定するのに対して、Containerはその他にもmargin, alignment, constraints, padding, transformなど他のレイアウトの制約も設定することが出来ます。
パフォーマンスの違い
SizedBoxはconstキーワードでコンパイル定数として定義 でき、実行時のインスタンス生成コストが発生しません。
一方、Containerはconstキーワードでコンパイル定数に指定出来ないため、実行時のインスタンス生成コストが発生します。
継承ツリーの違い
ContainerとSizedBoxの継承ツリーを下図で記します。
ContainerはStatelessWidgetを親に持つのに対して、SizedBoxはStatelessWidgetと親子関係にはなく、祖先としてRenderObjectWidget、SingleChildRenderObjectWidget を持ちます。
SizedBoxの兄弟として、CustomPaintクラスを持つことからも分かる通り、SizedBoxはレンダリング系のWidgetとして扱われていることがわかります。
SizedBoxとContainerの使い分け
width,heightでのみレイアウトを制約したい場合はconstキーワードでSizedBoxを宣言し、それ以外でレイアウトに対して制約を加えたい場合はContainerで宣言する方が良いです。
参考文献
-
SizedBox class ドキュメント/実装
-
Container class ドキュメント/実装
-
RenderObject Widget 実装
-
Stackoverflow
Discussion
参考になりました!ありがとうございます!
2点気になったところがあるのですが
こちらは「SizedBoxはconstキーワードでコンパイル定数として定義できるので、実行時のインスタンス生成コストが発生しません」ではないでしょうか?
また、継承ツリーの説明にある
こちらは「ContainerがStatelessWidgetを親に持つのに対して」ではないでしょうか?
よろしくお願いします!
指摘いただきとてもありがたいです!
指摘の通り、文章が間違っていたので訂正させていただきました。