Jetpack ComposeのAmbientについて

Posted by kwmt27 on Sun, Jan 17, 2021

はじめに

Jetpack Composeでステータスバーのカラーを変更するにはどうすればいいか調べていたら、ambientというキーワードが出てきて、なにものかがわからなかったのでメモです。

Ambientとは

Ambientとは、FlutterのProviderのようなものです。

サンプルコードを見たほうがわかりやすいと思いますので、見てみましょう。

// ① Ambientを作ります。
val ActiveUser = ambientOf<User> { error("No active user found!") }

@Composable
fun App(user: User) {
    // ② `Providers`コンポーネントを使用して、ambinentに値を渡します。
    Providers(ActiveUser provides user) {
        SomeScreen()
    }
}

// ③ツリーの間にあるコンポーネントはAmbientの値を知る必要はありません。
@Composable
fun SomeScreen() {
    UserPhoto()
}

@Composable
fun UserPhoto() {
    // ④ `current`プロパティを使うことでAmbinentの値を使うことができます。
    val user = ActiveUser.current
    ProfileIcon(src = user.profilePhotoUrl)
}

もしAmbientを使わなければ、コンポーネントに引数で渡していくことになり、渡された値が必要のないコンポーネントまで余計なものを知る必要が出てきてしまいます。

ambientOfとstaticAmbinentOfの違いについて

Jetpack Compose - What is the Difference Between ambientOf and staticAmbientOf こちらが詳しいです。

各ドキュメントはこちら

テーマの変更、端末の言語設定など変更機会が少なく、読み込みが書き込みより多い場合に staticAmbientOfを使うそうです。

staticAmbientOfでは、すべての子プロセスを再構成しますので、アンビエントを変更する際にコストがかかります(フレームが落ちる可能性もあります)。 ambientOfは、ターゲットを絞ったアップデートを行うため、再構成が速くなりますが、初期ツリーの構築や維持にコストがかかるため、アンビエントが変化しない場合でも、アプリ全体の動作が遅くなります。 staticAmbientOfのほうが一般的かもしれない。なぜなら、ambientの値となるものの多くは、多くのノードで消費されるはずで、多くのノードで消費されるものは、経験的にあまり変化しないと思うから(たとえば、端末の言語設定)

slackから翻訳して引用

参考

Ambient | Android デベロッパー | Android Developers Jetpack Compose - What is the Difference Between ambientOf and staticAmbientOf



comments powered by Disqus