#CompositionLocal(局部变量)

  • 广义上来说,CompositionLocal是一种能够让局部变量穿透在Composition的代码作用域范围,能够进行共享的API。
  • 这样能够让整个Compose内部的代码编写,变得更简洁。

##使用案例

  • 在顶层File中:

###LocalForTest.kt

import androidx.compose.runtime.compositionLocalOf

val LocalName = compositionLocalOf<String> { error("nothing setup.") }
val LocalTel = compositionLocalOf<Long> { error("nothing setup.") }

###使用CompositionLocal

  • 通过定义好的顶层CompositionLocal数据,我们可以在Compose函数中,随意穿透层级,调用这些变量。
setContent{
     CompositionLocalProvider(LocalName provides "test", LocalTel provides 13552305100) {
            Column {
                Modifier
                    .background(Color.White)
                    .height(IntrinsicSize.Max)
                Box(modifier = Modifier.size(100.dp, 100.dp))
                Text(
                    LocalName.current,//随时访问名称
                    Modifier
                        .background(
                            Color(0x1A1E293D),
                            RoundedCornerShape(20.dp)
                        )
                        .padding(90.dp, 40.dp),
                    fontSize = 36.sp,
                    color = Color(0xCC1E293D),
                    textAlign = TextAlign.Center,
                )
                Text(
                    LocalTel.current.toString(),//随时访问电话
                    Modifier
                        .background(
                            Color(0x1A1E293D),
                            RoundedCornerShape(20.dp)
                        )
                        .padding(90.dp, 40.dp),
                    fontSize = 36.sp,
                    color = Color(0xCC1E293D),
                    textAlign = TextAlign.Center,
                )
            }
        }
}

应用

  1. 最直接的应用,就是简化了函数传参的层级和繁琐性(相当于不需要手动传参)。

2.能够快速提供上下文相关的数据(主题、Compose基础API中的LocalContext.current就是快速提供一个页面级别的context,可以在Compose函数中随意调用)


 评论