JetpackComposeのSlot APIsの紹介

今回はJetpackComposeのSlot APIsについて書いていきます。
スライドを先に作成したため、そのスライドに説明を付与していく形で書いていきます。

speakerdeck.com

本編

f:id:mitoavadn:20210628214111p:plain JetpackComposeにはSlot APIsという概念があります。
今回はそのSlotAPIsをスライドベースで紹介していきます。


f:id:mitoavadn:20210628214232p:plain Slot APIsというのはComposableの上にカスタマイズのためのレイヤを適用するという概念です。

これを用いることで見た目のカスタマイズがしやすくなります。

Slot APIsが無い場合だとカスタマイズするために多くの引数を用意する必要が出てきます。
例えば、Buttonのテキストをカスタマイズできるようにするために、textColortextSizefontWeightなどなど......
Buttonだけでも多くあるため、他のComposableもとなるとより多くの引数が必要になってしまいます。

これがSlot APIsという概念のおかげで引数を大幅に減らすことができ、カスタマイズ性も高くできます。

JetpackComposeで使えるマテリアルコンポーネントのComposableでも多く定義されています。

イメージとしてはComposableで用意されている枠に対してComposableを当てはめることができるような感じです。


f:id:mitoavadn:20210628215735p:plain 例としてTopAppBarというComposableをあげます。
この画像の白い破線で囲まれている部分が


f:id:mitoavadn:20210628215921p:plain Slotになります。
ここに色々なComposableを当てはめることができます。


f:id:mitoavadn:20210628220258p:plain TopAppBarの定義を見てみます。


f:id:mitoavadn:20210628220436p:plain 赤い下線がある部分がSlotとして他のComposableを受け取る引数です。
型を@Composable () -> Unit のように定義することで他のComposableを利用できます。
TopAppBarではtitle, navigationIcon, actionsにComposableを当てはめることができます。


f:id:mitoavadn:20210628220905p:plain TopAppBarでのtitle, navigationIcon, actionsはそれぞれこの位置に当てはめることができます。


f:id:mitoavadn:20210628221108p:plain 利用する際のコード例を見ていきます。
まずは、よくあるような戻るボタン・タイトル・縦3点リーダーを表示する例です。
title, navigationIcon, actionsそれぞれにComposableスコープのラムダを渡しています。


f:id:mitoavadn:20210628221324p:plain あまり多い使い方ではないと思いますが、こういった見た目を実装することもできます。
NavigationIcon部分に複数行のテキスト、Title部分にテキスト+画像+テキスト、Actions部分に枠付きボタンといったことが簡単にできます。
AndroidViewの場合、Title部分にテキスト+画像+テキストを設置するような実装は複雑になるかと思いますがComposeの場合であれば並べるだけで実現できます。
それぞれのComposableで文字色やフォントの指定は行っていないですが、個々の見た目も簡単にカスタマイズすることができます。


f:id:mitoavadn:20210628221925p:plain TopAppBarを見てきましたが、他にもSlotが利用できるComposableは多く存在します。


f:id:mitoavadn:20210628222103p:plain Scaffoldという見慣れないものがあると思いますのでそちらについても説明していこうと思います。 


f:id:mitoavadn:20210628222244p:plain Scaffoldはよくあるようなマテリアルデザインなレイアウト構造の見た目を実現するために使われるComposableです。
Scaffoldで定義されているSlotは


f:id:mitoavadn:20210628222438p:plain このような破線で囲まれている部分にComposableを当てはめることができます。
TopAppBarにBottomNavBar、FABにDrawContentにComposableを配置できます。


f:id:mitoavadn:20210628222756p:plain Scaffoldの定義を見てみます。


f:id:mitoavadn:20210628222833p:plain 先ほど説明したSlot部分は赤い下線がある部分になります。
TopAppBarのSlotと同じように@Composable () -> Unit で定義されています。


f:id:mitoavadn:20210628223204p:plain 最後にまとめです。
Slot APIsによってComposableの見た目をカスタマイズすることができます。
デフォルトで提供されている多くのComposableの多くでSlotが用意されていますので利用しやすいですし、自前でSlotを用意するようなComposableの実装の参考にすることもできます。
自作の色々な画面で利用するような共通のComposableを実装する際にSlotを受け取って表示するようなComposableにするとカスタマイズ性も上がって良いと思います。


f:id:mitoavadn:20210628223610p:plain 今回参考にしたものは以下です。
developer.android.com

developer.android.com