はじめに
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