CompositionLocal如何及何时隐式设置值?相关使用困惑解析
关于Jetpack Compose中CompositionLocal隐式生效的疑问
我一直在试图搞明白CompositionLocal到底是怎么实现隐式设置值的,以及需要满足哪些条件才能让它生效,但Android官方的《使用CompositionLocal实现局部作用域数据》文档根本没解决我的困惑。
第一个示例的矛盾:明明用了CompositionLocal却要显式赋值
官方第一个示例里,通过MaterialTheme的LocalColors来设置Text的颜色:
// 位于MaterialTheme层级深处的某个可组合项 @Composable fun SomeTextLabel(labelText: String) { Text( text = labelText, // `primary` 来自MaterialTheme的LocalColors CompositionLocal color = MaterialTheme.colors.primary ) }
但这完全是显式设置啊,根本不是所谓的隐式生效!
第二个示例的困惑:为什么Text能自动用新的ContentAlpha?
接着官方展示了另一个示例,用CompositionLocalProvider修改ContentAlpha,此时Text不用显式设置alpha参数,就能自动使用新值:
@Composable fun CompositionLocalExample() { MaterialTheme { // MaterialTheme默认设置ContentAlpha.high Column { Text("使用MaterialTheme提供的透明度") CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { Text("LocalContentAlpha被设置为medium值") Text("这个Text也使用medium值") CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) { DescendantExample() } } } } } @Composable fun DescendantExample() { // CompositionLocalProvider的作用范围跨可组合函数 Text("这个Text现在使用disabled透明度") }
文档说MaterialTheme底层就是用CompositionLocal实现的,那为什么第一个示例不能像这样让Text隐式使用颜色值?
第三个示例的疑问:自定义CompositionLocal还是要显式传参?
第三个示例展示了如何创建自定义CompositionLocal,但这里又需要显式设置Card的elevation参数:
@Composable fun SomeComposable() { // 获取全局定义的LocalElevations变量,拿到当前组合树中的Elevations实例 Card(elevation = LocalElevations.current.card) { // 内容 } }
创建CompositionLocalProvider不就是为了避免这种显式传递参数吗?那这样用的意义何在?
// 将elevation绑定为LocalElevations的值 CompositionLocalProvider(LocalElevations provides elevations) { // ... 内容区域 ... // 这个组合树区域访问LocalElevations.current时会拿到`elevations`实例 }
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

