Jetpack Compose 0.1.0-dev04から0.1.0-dev05にしたときに変更が必要だったところ
Jetpack Compose 0.1.0-dev05が出ました。 リリースノートはこちら https://developer.android.com/jetpack/androidx/releases/compose#0.1.0-dev05
前回に引き続き、アップデートでエラーになる部分と対応方法を紹介していきます。
androidx.ui.layout.Paddingが廃止
androidx.ui.layout.Paddingが廃止され、androidx.ui.layout.LayoutPaddingになりました。PaddingはComposableだったのに対して、LayoutPaddingはModifierです。次のような使い方になります。
before
Padding( 8.dp ) { Text(text = "こんにちは") }
after
Text(
modifier = LayoutPadding( 8.dp ),
text = "こんにちは"
)
FontFamilyのコンストラクタがprivateになった
カスタムフォントを使う時はres/font にフォントファイルを置きつつ、FontFamilyを作って利用する形だったのですが、FontFamilyのコンストラクタがprivateになり、作り方が変わりました。
before
FontFamily( // res/font/ipam.ttf にファイルを置いておく Font(name = "ipam.ttf", weight = FontWeight.W400, style = FontStyle.Normal) )
after
font(R.font.ipam, weight = FontWeight.W400, style = FontStyle.Normal)
Ambient.ofが廃止
Ambient.ofの代わりにambientOf関数が生えました。Providerも独立して、Providersになりました。Provideする値増えたらネスト大変だなーと思ってたところなのでちょうどいいです。
before
val IpamFontAmbient = Ambient.of<FontFamily>() @Composable fun IpamFontProvider(children : @Composable() () -> Unit) { val fontFamily = remember { FontFamily( Font(name = "ipam.ttf", weight = FontWeight.W400, style = FontStyle.Normal) ) } IpamFontAmbient.Provider(value = fontFamily, children = children) }
after
val IpamFontAmbient = ambientOf<Font>() @Composable fun IpamFontProvider(children : @Composable() () -> Unit) { val font = remember { font(R.font.ipam, weight = FontWeight.W400, style = FontStyle.Normal) } Providers(IpamFontAmbient.provides(value = font), children = children) }
ambient関数が非推奨
上位のComposableからProvideされる値を取り出す時はambient関数を使ってましたが、非推奨になりました。代わりにambient関数にkeyとして渡しているAmbilentインスタンスのcurrentを使います。
before
val font = ambient(IpamFontAmbient)
after
val font = IpamFontAmbient.current
androidx.ui.core.ambientDensity関数が廃止
Composable内でdensityを取り出せるandroidx.ui.core.ambientDensity関数がなくなりました。
before
import androidx.ui.core.ambientDensity val density = ambientDensity()
after
import androidx.ui.core.DensityAmbient val density = DensityAmbient.current
withDensity関数が廃止
withDensity関数は、DensityScope.() -> Unitを受け取ることで、Dp.toPx関数などの拡張関数を使えるスコープを提供するのですが、なくなりました。代わりにDensityScopeと同様の拡張関数を持つDensity interface が用意されました。DensityAmbient.currentでDensityインスタンスを取り出せるので、kotlinのwith関数を使って同じことができます。
before
withDensity(density) {
Paint().apply {
isAntiAlias = true
style = PaintingStyle.stroke
this.strokeWidth = strokeWidth.toPx().value
}
}
after
val density = DensityAmbient.current with(density) { Paint().apply { isAntiAlias = true style = PaintingStyle.stroke this.strokeWidth = strokeWidth.toPx().value } }
ImageがPainterに変更
画像の表示はImageを使ってましたがPainterという抽象クラスが使われるようになりました。VectorAssetはImageになれないので、Painterで抽象化するのかなと思ったらVectorPainterはまだないみたいです。
before
AppBarIcon(
icon = imageResource(R.drawable.ic_baseline_arrow_back_24),
onClick = {
backStack?.pop()
}
)
after
AppBarIcon(
icon = ImagePainter(imageResource(R.drawable.ic_baseline_arrow_back_24)),
onClick = {
backStack?.pop()
}
)
Buttonの引数が変更
styleが展開されたほか、textがなくなりchildrenになりました。
before
Button(
"キャンセル",
style = ButtonStyle(
backgroundColor = MaterialTheme.colors().secondary,
contentColor = MaterialTheme.colors().onSecondary,
shape = MaterialTheme.shapes().button,
elevation = 2.dp
),
onClick = onCloseRequest
)
after
Button(
backgroundColor = MaterialTheme.colors().secondary,
contentColor = MaterialTheme.colors().onSecondary,
shape = MaterialTheme.shapes().button,
elevation = 2.dp,
onClick = onCloseRequest
) {
Text("キャンセル")
}
終わりに
結構大変だった...。でもだいぶ洗練されてきた印象がある。今後が楽しみです。