visible true

技術的なメモを書く

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("キャンセル")
}

終わりに

結構大変だった...。でもだいぶ洗練されてきた印象がある。今後が楽しみです。