I/O Extended Japan 2021 - Flutter に登壇したときのスライドです。
Session- Layered ArchitectureとWidget Tree https://gdgkyoto.connpass.com/event/215611/
Flutter のLayered ArchitectureとWidget Tree (と並行するTreeの構造)に関して解説しています。
Layered Architecture ͱ Widget Tree΅ͨͪ(Twitter: @bot6rice) I/O Extended Japan 2021 - Flutter on Jun 22, 2021Building a desktop design language with Flutter
View Slide
ࣗݾհ• ΅ͨͪ• Twitter: @bot6rice• ຊۀ• αʔόʔαΠυΤϯδχΞ• Python / Go / AWS …• Flutter• ࡢ12݄͔ΒݸਓͰ• Flutter Osaka
I/O Extended Japan 2021 - Flutter1. Recapping Google I/O - ηογϣϯͷ֓ཁ2. Layered Architecture3. Widget Treeʢ3ͭͷTreeߏʣ4. StatefulWidget ͷਖ਼ମ5. ·ͱΊ
1. Recapping Google I/O
Building a desktop design language with FlutterTodd Volkert (Engineering Manager)https://www.youtube.com/watch?v=z6PpxO7R0gM
Session֓ཁ• ൴͕14લʹ։ൃͨ͠σεΫτοϓɾΞϓϦΛFlutterͰ࠶ݱ• SpinnerΛMaterial DesignͰ࠶ݱ͢ΔͱΤϥʔ͕ൃੜ• SpinnerͳͲWidgetΛࣗ࡞͠Α͏ʂʢ͜ΕΛChicago DesignͱݺͿʣ• Chicago DesignͷCustom LayoutΛͲ͏ίʔσΟϯά͢Δ͔Λհ
Chicago Design App SpinnerSession֓ཁ
Custom LayoutʹඞཁͳLayered Architecture ͱ 3ͭͷTreeΛཧղ͍ͯ͠ͳ͍ͱޙ͔ΒʮԿݴͬͯΔͷʁʯঢ়ଶ…😇
Layered Archͱ3ͭͷTreeߏΛղઆ💪
2. Layered Architecture
Flutter͍͔ͭ͘ͷLayerʹ͚ͯઃܭ͞Ε͍ͯ·͢
Layered ArchitectureRenderingWidgetMaterial Cupertinodart:ui
dart:ui LayerRenderingWidgetMaterial Cupertinodart:ui• Flutter Framework͔ΒFlutterΤϯδϯΛར༻͢ΔLayer• Canvas, RawϨϕϧͷςΩετϨϯμϦϯάͳͲΛѻ͏• ͜ͷLayerͰΞϓϦΛ࣮͠Α͏ͱ͢ΔͱɺεΫϦʔϯใͳͲ͔ΒϨΠΞτͷ࠲ඪஔΛܭࢉ͠ͳ͍ͱ͍͚ͳ͍
dart:ui LayerRenderingWidgetMaterial CupertinoFoundationAnimation Painting Gestures👈 ͷΑ͏ʹهࡌ͞ΕΔ͜ͱɻެࣜυΩϡϝϯτhttps://flutter.dev/docs/resources/architectural-overview
Rendering LayerRenderingWidgetMaterial Cupertinodart:ui• Layout Abstraction: ϨΠΞτΛநԽͨ͠Layer• dart:ui LayerͰ࠲ඪܭࢉͷͨΊͷίʔσΟϯά͕ඞཁ͕ͩͬͨɺ͜ͷLayerͰͦΕΛѻ͍ͬͯΔ• RenderObject TreeΛѻ͏Layer• RenderObjectͷcreateͱupdateͰ֤ʑϩδοΫΛίʔσΟϯάΛ͠ͳ͍ͱ͍͚ͳ͍
Widget LayerRenderingWidgetMaterial Cupertinodart:ui• Composition Abstraction: ϘλϯςΩετͳͲͷߏΛநԽͨ͠Layer• Widget TreeΛѻ͏Layer• ը໘Λߋ৽͍ͨ͠ͱ͖ʹWidget TreeΛ৽ͨʹ࡞Ε͍͍ͷͰɺRenderingLayerͷΑ͏ʹcreateͱupdateΛؾʹ͢Δඞཁ͕ͳ͍
Material / Cupertino LayerRenderingWidgetMaterial Cupertinodart:ui• Design languageͷLayer• Material Design Cupertino DesignΛϢʔβʔ͕؆୯ʹίϯτϩʔϧͰ͖ΔΑ͏ʹͨ͠Layer• Widget LayerΛݩʹ͍ͯ͠Δ
⚠ I/OͷηογϣϯͰLayer͕ҟͳ͍ͬͯ·ͨ͠ɻಉηογϣϯͰΦεεϝ͞Ε͍ͯͨಈըͷLayerͰհ͍͖ͤͯͨͩ͞·ͨ͠ɻࢀߟ: The Mahogany Staircase - Flutter’s Layered Designhttps://www.youtube.com/watch?v=dkyY9WCGMi0&t=143s
Widget Tree ʢ3ͭͷTreeߏʣ
RenderingWidget• Widget TreeΛߏ͢ΔLayer• Rendering LayerΛݩʹߏ͞ΕΔ• Layer Abstraction: ϨΠΞτͷѻ͍ΛநԽ• RenderObject TreeΛߏ͢ΔLayerTreeʹؔ࿈ͯ͠ਂ۷Γ͠·͢💪Layered Architecture
݁• Widgetʹฒߦ͢ΔܗͰ3ͭͷTree͕࡞ΒΕΔ• Widget Tree• Element Tree• RenderObject Tree• TreeͷΠϯελϯε͕࡞ΒΕΔॱ൪: Widget → Element → RenderObject• WidgetImmutableʢෆมʣͳͷͰ ը໘ͷߋ৽࣌ʹຖஔ͖ΘΔ• RenderObjectMutableʢมߋՄʣͳͷͰՄೳͳݶΓ࠶ར༻͞ΕΔ
Widget Tree Element Tree RenderObject TreePropertyใʢྫ: RichTextͷtextͳͲʣWidgetRenderObjectΛཧαΠζϨΠΞτɺඳࣸʹؔͯ͠ͷใΛ࣋ͭ(ྫ: PaddingͷchildͱpaddingͷαΠζͳͲ)PublicͷAPI
runApp ͔ؔΒԿ͕ى͖͍ͯΔ͔ݟ͍͖ͯ·͢👀
Widget Tree Element Tree RenderObject TreeCenter(Root widget)Widget TreeͷrootʹCenter WidgetͷΠϯελϯε͕ੜ͞ΕΔ
WidgetcreateElementʹΑΓElement͕ੜ͞ΕΔ
Widget Tree Element Tree RenderObject TreeCenter(Root widget)SingleChildRenderObjectElementWidgetͷcreateElementϝιουʹΑΓElement͕ੜ͞ΕΔ
ElementcreateRenderObjectʹΑΓRenderObject͕ੜ͞ΕΔ
Widget࡞ΒΕΔͷ RenderPositionedBox
Widget Tree Element Tree RenderObject TreeCenter(Root widget)RenderPositionedBoxSingleChildRenderObjectElementElement͔Βwidget.createRenderObject͕ݺΕੜ͞ΕΔ
Widget Tree Element Tree RenderObject TreeCenter(Root widget)RenderPositionedBoxRichTextMultiChildRenderObjectElementRenderParagraph(Text: Hello World!)SingleChildRenderObjectElementࢠʹରͯ͠ಉ༷ʹWidget → Element → RenderObject͕࡞ΒΕͯ “Hello World!” ͕දࣔ✌
ը໘ߋ৽࣌ͷTreeͷมԽrunAppΛ2ճݺΜͰΈΔ🔔🔔
͜ͷ࣌FlutterTreeͷΠϯελϯεΛͰ͖ΔݶΓ࠶ར༻͠Α͏ͱ͢Δɻ
Widget Tree Element Tree RenderObject TreeCenter(Root widget)RenderPositionedBoxRichTextMultiChildRenderObjectElementRenderParagraph(Text: Hello World!)SingleChildRenderObjectElementCenter(Root widget)RichTextNEWWidgetImmutableͳͷͰશऔͬସ͑͞ΕΔ
runtimeType ɺ͜͜Ͱ Center RichTextElement RenderObject͕࠶ར༻Ͱ͖Δ͔֬ೝɻ
Widget Tree Element Tree RenderObject TreeCenter(Root widget)RenderPositionedBoxRichTextMultiChildRenderObjectElementRenderParagraph(Text: Hello World!)SingleChildRenderObjectElementcanUpdatetrueͳͷͰElementͱRenderObject࠶ར༻͞ΕΔ
Widget Tree Element Tree RenderObject TreeCenter(Root widget)RenderPositionedBoxRichTextMultiChildRenderObjectElementRenderParagraph(Text: Hello Flutter!)SingleChildRenderObjectElementupdateRenderObject͕ݺΕͯը໘͕ߋ৽͞ΕΔɻRichTextͷtext͕RenderObjectʹ͞Εͯจࣈ͕มΘΔɻ
ͪΐͬͱͬͯԼ͍͞ʂʂ✋
ԿઍɺԿສͱWidget͕͋ͬͨͱ͖ʹ1ݸͷWidgetͷมԽͷͨΊ͚ͩʹWidget Tree͕શऔͬସ͑͞ΕΔͷͬͯඇޮ͡Όͳ͍ʁ🤔
ͦ͜Ͱ༻ҙ͞Ε͍ͯΔͷ͕ͪ͜Βʂ
StatefulBuilder Ͱ͢ʂʂ
StatefulWidgetͷਖ਼ମ
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Foo)SingleChildRenderObjectElementFooStatefulElement
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Foo)SingleChildRenderObjectElementFooStatefulElementStatefulBuilder ɾchildΛ࣋ͨͳ͍ʢ࣋ͭͷbuilder callbackؔͷฦΓʹΑΓٙࣅతʹchildΛ࣋ͭʣɾRenderObjectΛ࣋ͨͳ͍
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Foo)SingleChildRenderObjectElementFooStatefulBuilderFooElement RenderFooඇಉظॲཧͰStatefulBuilder͔ΒFoo͕ฦ͞ΕΔͱWidget → Element → RenderObject ͕ੜ͞ΕΔɻʢۂͨ͠ҹݫີͳchildͰͳ͍͜ͱΛࣔ͢ʣ
͞ΒʹඇಉظॲཧͰBar͕ฦ͖ͬͯͨ
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Bar)SingleChildRenderObjectElementFooStatefulElementFooElement RenderFooBarஔ͖ΘΔWidgetFooͱͦͷChild / ChildrenͷΈʂ
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Bar)SingleChildRenderObjectElementBarStatefulElementBarElement RenderBar
ͱ͜ΖͰɺStateʹ͢ΔมͲ͏อ࣋͢Δ͖͔…🤔builder Callbackͷ֎ͰมΛએݴ͠ͳ͍ͱ͍͚ͳ͍͔͠ͱݴͬͯάϩʔόϧมʹ࣋ͨͤΔͱεέʔϧ͠ͳ͍ͳ͊
💡ͦ͏ͩʂElementʹStatebuilder callback࣋ͨͤͯ͠·͓͏ʂ
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilder(builder: return Foo)SingleChildRenderObjectElementFooStatefulBuilderFooElement RenderFooStateElementʹStateΛ࣋ͨͤͯ…
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulBuilderSingleChildRenderObjectElementStatefulElementFooElement RenderFooStatebuilder callback͞Βʹbuilder callback࣋ͨͤΔFoo
Μʁ😳͜ͷΈͲ͔͜ͰݟͨΑ͏ͳ…
ͦ͏Ͱ͢ʂ StatefulWidget ͷΈͦͷͷͰ͢ʂ
Widgetͷ createState ͰState࡞ͬͯΔ͠
StateͷPropertyͱͯ͠มએݴΛ͢Δ͠
StateͷதͰbuild CallbackΛఆٛͯ͠Δ͠ʂ
Widget Tree Element Tree RenderObject TreeCenterRenderPositionedBoxStatefulWidgetSingleChildRenderObjectElementStatefulElementFooElement RenderFooStatebuilder callbackFooStatefulWidgetTreeͩͱ͜ͷ෦ʹ֘
ͳͷͰStatefulWidgetͰը໘ͷߋ৽͕ൃੜͯ͠Widget TreeͷऔΓସ͑࠷খݶʂ👏
StatelessWidgetߟ͑ํ StatefulWidget ͱಉ͡ɻState ͕ແ͍ͷͰClass͕1ͭʹͳͬͨɻʢbuild Callback݈ࡏʣ
·ͱΊ
·ͱΊ• FlutterͷLayered ArchitectureͱTreeߏΛΔͱɺDesign LanguageΛࣗ࡞Ͱ͖ΔΑ͏ʹͳΔ• Layerʹ dart:ui, Rendering, Widget, Material / Cupertino ͕͋Δ• Treeʹ Widget Tree, Element Tree, RenderObject Tree͕͋Δ• StatefulWidgetͷStateElement͕ཧ͍ͯͨ͠
ͬͱৄ͘͠How Flutter renders widgetsWhen to Use KeysThe Mahogany StaircaseFlutter’s Layered Designࠓͷ༰͕ΑΓৄ͘͠ղઆ͞Ε͍ͯΔɻdart:ui Layer͔Βͷ࣮ͷҰڵɻhttps://www.youtube.com/watch?v=dkyY9WCGMi0StatefulWidgetͷElement Tree͕ཧղͰ͖͍ͯΕɺཧղ͍͢͠ɻhttps://www.youtube.com/watch?v=kn0EOS-ZiIcTreeͷجຊతͳղઆɻhttps://www.youtube.com/watch?v=996ZgFRENMs
HAPPY CREATING!! 👋