Jetpack Compose:如何将值传递给树中的可组合项?

Abd*_*ؤمن 6 android android-jetpack-compose

我现在使用 Compose 将参数传递给函数,但我觉得,随着每个新数据沿着树传递,这些参数会变得越来越长。

我想知道是否有一种方法可以将值传递给树上的其他可组合项。

Abd*_*ؤمن 7

除了使用可组合项的函数参数(推荐的方式)之外,您还可以使用CompositionLocal对于不被视为树范围或子层次结构范围的概念,避免 CompositionLocal 。

首先,定义全局变量compositionLocalOf (例如,在LocalCompositions.kt中):

import androidx.compose.runtime.compositionLocalOf

data class Post(val title: String)
val LocalPost = compositionLocalOf { Post(title = "Ahmed") }
Run Code Online (Sandbox Code Playgroud)

然后在@Compose函数内定义它以供树下的其他可组合项使用:

import androidx.compose.runtime.compositionLocalOf

data class Post(val title: String)
val LocalPost = compositionLocalOf { Post(title = "Ahmed") }
Run Code Online (Sandbox Code Playgroud)

现在,检索 a 内的值@Composable

// composable down the nodes tree
@Composable
fun PostContentView() {
  ...
  val post = LocalPost.current
  ...
}
Run Code Online (Sandbox Code Playgroud)

观察变量变化

如果您想实现上述解决方案,但要监视变量的更改并相应地更新可组合项(节点),则可以使用MutableState变量。

重新定义前面的例子:

LocalCompositions.kt

import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.mutableStateOf

data class Post(val title: MutableState<String> = mutableStateOf(""))
val LocalPost = compositionLocalOf { Post(title = mutableStateOf("Ahmed")) }
Run Code Online (Sandbox Code Playgroud)

然后在@Compose函数内定义它以供树下的其他可组合项使用:

@Composable
fun MainView() {
  ...
  val post = Post(title = "Shamil")

  CompositionLocalProvider(LocalPost provides post) {
    PostContentView()
  }
  ...
}

Run Code Online (Sandbox Code Playgroud)

现在,检索 a 内的值@Composable

// composable down the nodes tree
@Composable
fun PostContentView() {
  ...
  val post = LocalPost.current
  ...
}
Run Code Online (Sandbox Code Playgroud)