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("キャンセル") }
終わりに
結構大変だった...。でもだいぶ洗練されてきた印象がある。今後が楽しみです。