Android 開発に入門して半年以上が経つ。
画面実装で避けては通れないコンポーネント間の間隔について、Spacer を使うべきか、padding を使うべきか時々悩むことがある。というのは、自分の手で実装する場合は割と手癖的に padding ベースで書くことが多い気がするだが(SiwftUIでもそうしていたので)、Claude に書かせていると惜しげもなく Spacer を挿入してくるので、どちらが適切なのだろう?と疑問に思ったのだった。
もちろん、Spacer / padding の判断は要所要所で行って良いはずだ。代表的な例で言えば、画面幅によって可変する間隔は迷いなく Spacer で表現するだろう。とはいえ、どういうケースでどうするべきか、網羅的には言語化できていなかった。
Android 開発でのデファクトがどうなっているのか、”Jetpack Compose Spacer vs padding” のようなキーワードで検索してみたところ、いくつか興味深い情報を見つけたので、ここで何か結論を出すつもりはないが個人的にメモしてみる。
- Space Hoisting: Should I use the padding Modifier or the Spacer composable?
- お馴染み “State Hoisting” の概念をもじって “Space Hoisting” という考え方を紹介している。間隔のレイアウトを子ではなく親に委ねるというもの(子は自身の周囲に空間を持たず、親側で
SpacerやModifier.padding(...)で空間をレイアウトする) - その上で、
Spacerの有効性を説明している- 空白の表現を意図的に伝えられる
- コンポーネントのカプセル化を保てる
- 対象がタップ可能の場合、当たり判定や ripple effect への影響を考えるとよりシンプル
- コンポーネントのサイズ計算に影響しない
- お馴染み “State Hoisting” の概念をもじって “Space Hoisting” という考え方を紹介している。間隔のレイアウトを子ではなく親に委ねるというもの(子は自身の周囲に空間を持たず、親側で
ごもっともである。
いっぽう、両者でレイアウト処理のパフォーマンスに違いがありそう(感覚的に、要素数の増える Spacer の方が遅い気がする)だと感じていたのだが、実際に検証している Stack Overflow の投稿を見つけた。
android – Compose Spacer vs view padding performance – Stack Overflow
極端な事例では Spacer のレイアウトコストが顕にはなったが、結論ケースバイケースで、どちらかを一辺倒に選択する根拠にはならないことが分かった。
他の投稿を読んでも共通してケースバイケースに捉えている。あるとすれば、対象要素がコントロールの場合は、タップ(Android では特に ripple effect を含め)どのように作用させたいかで考えれば良さそう。
- Padding or Spacer? : r/JetpackCompose
- Space Hoisting: Should I use the padding Modifier or the Spacer composable? : r/androiddev
- padding() vs Spacer() in Jetpack Compose — What’s the Real Difference? | by Dhivya | Medium
STORES さんのように、どういったケースでどちらを使うか、ルール化しておくと AI に書かせてもブレないので、これを参考にチームでも検討したいと思った。