Slide 1

Slide 1 text

SliverAppBarはなぜ変化する? ~ Sliverを内側から理解する ~ Aoi Umigishi Flutter Kaigi 2024

Slide 2

Slide 2 text

SliverAppBarの例

Slide 3

Slide 3 text

SliverAppBarがスクロールに応じて 大きさが変化するのはなぜ? 疑問 仕組みを理解したい!

Slide 4

Slide 4 text

解決方法 Flutterの仕組みを理解するには? 内部コードを読む!

Slide 5

Slide 5 text

本発表で話すこと Sliver 並びにSliver App Bar について、 内部コードから理解した仕組みの解説

Slide 6

Slide 6 text

Sliver とは RenderSliverプロトコルによって 描画されるWidget ※ プロトコル = 画面描画の仕組み

Slide 7

Slide 7 text

画面描画プロトコルの例 ・RenderSliver プロトコル ・RenderBox プロトコル ※ RenderBox,RenderSliverは   RenderObjectのサブクラス

Slide 8

Slide 8 text

RenderObjectとは Widgets Elements Render Objects Flutterの主要な3つのツリー

Slide 9

Slide 9 text

Widgets Elements Render Objects Flutterの主要な3つのツリー 構成要素の設定値を管理するもの RenderObjectとは

Slide 10

Slide 10 text

Widgets Elements Render Objects Flutterの主要な3つのツリー 構成要素の実体を管理するもの RenderObjectとは

Slide 11

Slide 11 text

Widgets Elements Render Objects Flutterの主要な3つのツリー 画面描画を管理するもの RenderObjectとは

Slide 12

Slide 12 text

RenderObjectの主要なメソッド ・performLayout ・paint ・describeSemanticsConfiguration

Slide 13

Slide 13 text

RenderObjectの主要なメソッド ・performLayout ・paint ・describeSemanticsConfiguration サイズと位置を決定する

Slide 14

Slide 14 text

Constraints go down. Sizes go up. Parent sets position. Understanding constraintsより https://docs.flutter.dev/ui/layout/constraints サイズと位置を決定する考え方

Slide 15

Slide 15 text

画面描画プロトコルの例 ・RenderSliver プロトコル ・RenderBox プロトコル

Slide 16

Slide 16 text

サイズと位置の決定の例 85 60 20 30 子 1 子 2 250 このレイアウトの決定の流れを見ていく

Slide 17

Slide 17 text

親から幅と高さの制約の指定 250 85 サイズと位置の決定の例

Slide 18

Slide 18 text

子1に制約を伝える 240 75 上下左右5の Padding サイズと位置の決定の例

Slide 19

Slide 19 text

子1のサイズの決定 240 75 子 1 20 サイズと位置の決定の例

Slide 20

Slide 20 text

子2に伝える制約の決定 240 75 子 1 サイズと位置の決定の例 55 20

Slide 21

Slide 21 text

子2のサイズの決定 90 75 サイズと位置の決定の例 30 子 2 子 1 20

Slide 22

Slide 22 text

位置の決定 90 75 サイズと位置の決定の例 30 子 2 子 1 20

Slide 23

Slide 23 text

自身のサイズの決定 60 サイズと位置の決定の例 30 子 2 子 1 20 250

Slide 24

Slide 24 text

画面描画プロトコルの例 ・RenderSliver プロトコル ・RenderBox プロトコル

Slide 25

Slide 25 text

RenderSliver プロトコル SliverConstraints と SliverGeometry による、 スクロールに対する画面描画プロトコル

Slide 26

Slide 26 text

画面描画プロトコルの例 ・RenderSliver プロトコル ・RenderBox プロトコル → 中身を全てレイアウトし描画 → 画面に映る部分のみ描画

Slide 27

Slide 27 text

RenderSliver プロトコル 描画範囲 (Viewport) SliverList SliverGrid SliverList サイズ計算されない 描画される

Slide 28

Slide 28 text

SliverConstraints スクロール方向や量 画面描画範囲に対するオフセット量

Slide 29

Slide 29 text

SliverConstraints ・RenderSliver ・RenderBox

Slide 30

Slide 30 text

描画サイズ 描画位置 SliverGeometry 描画されるか否か

Slide 31

Slide 31 text

SliverGeometry ・RenderBox ・RenderSliver

Slide 32

Slide 32 text

RenderSliver プロトコル Viewport SliverList Child SliverConstraints SliverConstraints

Slide 33

Slide 33 text

RenderSliver プロトコル Viewport SliverList Child SliverGeometry SliverGeometry

Slide 34

Slide 34 text

RenderSliver プロトコルの利用例 - ListView - GridView - CustomScrollView - etc …

Slide 35

Slide 35 text

例:CustomScrollView

Slide 36

Slide 36 text

例:ScrollView

Slide 37

Slide 37 text

例:ScrollView

Slide 38

Slide 38 text

例:ScrollView Viewportにスクロール位置を伝えている

Slide 39

Slide 39 text

例:ScrollView スクロール位置

Slide 40

Slide 40 text

例:ScrollView スクロール位置

Slide 41

Slide 41 text

SliverAppBarはなぜ変化する?

Slide 42

Slide 42 text

SliverAppBarはなぜ変化する? SliverConstraintsから、大きさを計算 animation value

Slide 43

Slide 43 text

SliverAppBarはなぜ変化する? SliverGeometoryを更新

Slide 44

Slide 44 text

SliverAppBarはなぜ変化する? スクロール方向、量によってアニメーションを開始

Slide 45

Slide 45 text

Flutter 3.24で追加されたSliver SliverResizingHeader PinnedHeaderSliver

Slide 46

Slide 46 text

PinnedHeaderSliver PinnedHeaderSliver class API ドキュメントより https://api.flutter.dev/flutter/widgets/SliverResizingHeader- class.html

Slide 47

Slide 47 text

SliverResizingHeader SliverResizingHeader class API ドキュメントより https://api.flutter.dev/flutter/widgets/SliverResizingHeader-class .html

Slide 48

Slide 48 text

まとめ SliverAppBarがスクロールに応じて 大きさが変化するのはなぜ? スクロールに応じた画面描画の仕組み (RenderSliver プロトコル)があるから !

Slide 49

Slide 49 text

ご清聴ありがとうございました! Aoi Umigishi フリーランスエンジニア SNS等

Slide 50

Slide 50 text

参考文献 【Flutter】Sliverの仕組みを理解する https://zenn.dev/3ta/articles/5a439a8f0c4b62 Flutter API reference documentation https://api.flutter.dev/ Understanding constraints https://docs.flutter.dev/ui/layout/constraints