Jetpack ComposeのPreviewが超便利
この記事で伝えたいこと
使い回すけど、入れる値によって表示を変えたいっていうようなViewってありますよね。Previewを使えば、それが正常に動いているかどうかを、一発で分かって便利だよということです。
皆さんの使うきっかけになってもらえれば幸いです。
こんな感じで動く
例えば、メールソフトのメニューバーを考えます。受信箱や送信箱など、箱によってアイコンを変えてますよね(本当かよ?という方はGmailアプリを起動してみてください)。
それを、実装してみようと思います。
まず、最初にどんな感じで動くのか示します。
実行結果
実行結果はこんな感じです。実行結果と言ってもいちいちアプリを走らせるのではなく、コードと一緒に出てきます。ちゃんと、アイコンが変わっているのが一目瞭然ですね!
UIテストをわざわざ走らせなくても、どんなViewになるのかが分かるって便利だなーと思いました。
コード
@Preview
@Composable
fun BoxSelectButtonView(
@PreviewParameter(BoxSelectButtonViewParameterProvider::class) paraView: ParameterBoxSelectButtonView
) {
val listIcons: List<IconsList> = listOf(
IconsList(
Icons.Filled.Email, "INBOX"
),
IconsList(
Icons.Filled.Send, "OUTBOX"
),
IconsList(
Icons.Filled.Warning, "SPAM"
),
IconsList(
Icons.Filled.Delete, "TRASH"
)
)
var iconData = listIcons
.filter { it.boxName.lowercase() == paraView.boxName.lowercase() }
if (iconData.size == 0) {
iconData = listOf(
IconsList(
icon = Icons.Outlined.Folder,
boxName = paraView.boxName
)
)
}
if (iconData.size == 1) {
TextButton(onClick = {},
modifier = Modifier.fillMaxWidth()
) {
Icon(iconData[0].icon, contentDescription = iconData[0].boxName)
Text(text = iconData[0].boxName)
}
}
}
data class ParameterBoxSelectButtonView(
val stateDrawer: DrawerState?,
val boxName: String,
)
class BoxSelectButtonViewParameterProvider: PreviewParameterProvider<ParameterBoxSelectButtonView> {
override val values: Sequence<ParameterBoxSelectButtonView>
get() = sequenceOf(
ParameterBoxSelectButtonView(
boxName = "INBOX Dayo",
stateDrawer = null,
),
ParameterBoxSelectButtonView(
boxName = "INBOX",
stateDrawer = null,
),
ParameterBoxSelectButtonView(
boxName = "OUTBOX",
stateDrawer = null,
),
ParameterBoxSelectButtonView(
boxName = "SPAM",
stateDrawer = null,
),
ParameterBoxSelectButtonView(
boxName = "TRASH",
stateDrawer = null,
)
)
}
少しだけ説明すると、PreviewParameter
というのでPreview出来るように値を入れています。ただし、1つの値しか入れられないのでParameterBoxSelectButtonView
というラッパークラスを作って、それを使って値を入れています。
最後のBoxSelectButtonViewParameterProvider
が重要なのですが、この中のsequenceOfに試したい入力パターンを入れます。IconsList
に入力されたboxName
によって、何のアイコンを表示するかを変えています。もしも、このリストになければFolderがアイコンとして選択されます。
参考にした記事
Android公式ページ[1]では、わざわざComposable Functionを複数用意していたのですが、これは面倒だなと思って、こちらのSatoさんの記事[2]を参考にしました。ところが、Satoさんの記事では、動かした様子がなかったので、今回の記事で紹介しています。
-
レイアウト プレビュー / Android https://developer.android.com/jetpack/compose/preview?hl=ja (2022-01-01閲覧) ↩︎
-
Jetpack Compose: PreviewParameterアノテーションを使っていろいろなプレビューを作る / Sato Shun https://satoshun.github.io/2020/07/compose-preview/ ↩︎
Discussion