如何在 jetpack compose 中从另一个可组合项访问状态?

How to access state from another composable in jetpack compose?

提问人:Jorpy 提问时间:6/13/2023 更新时间:6/13/2023 访问量:534

问:

如何在 jetpack compose 中从另一个可组合项访问状态?想要从另一个可组合项访问状态。

@Composable
fun MySwitch() {
  val checkedState = remember { mutableStateOf(true) }
  Switch(
    checked = checkedState.value,
    onCheckedChange = { checkedState.value = it }
  )
}

@Composable
fun MyUi() {
  MySwitch()
  Text(
    text = if(checkedState) "foo" else "bar",
  )
}
android-jetpack-compose 安卓喷气背包

评论

3赞 Abhimanyu 6/13/2023
你必须提升状态 - developer.android.com/jetpack/compose/state#state-hoisting

答:

1赞 Ayman Ait 6/13/2023 #1

这实际上取决于你的情况,我可以给你 3 种方法:

如果您只有一个开关和一个文本:

[kotlin]
        @Composable
        fun MySwitch(checkedState: MutableState<Boolean>) {
          Switch(
            checked = checkedState.value,
            onCheckedChange = { checkedState.value = it }
          )
        }
        
        @Composable
        fun MyUi() {
        val checkedState = remember { mutableStateOf(true) }
          MySwitch(checkedState = checkedState)
          Text(
            text = if(checkedState.value) "foo" else "bar",
          )
        }

如果您有多个开关和与之关联的文本:

@Composable
fun MySwitch() {
  val checkedState = remember { mutableStateOf(true) }
  Switch(
    checked = checkedState.value,
    onCheckedChange = { checkedState.value = it }
  )
Text(
    text = if(checkedState.value) "foo" else "bar",
  )
}

@Composable
fun MyUi() {
  MySwitch()
MySwitch()
MySwitch()
}

如果你知道MVVM,并且需要在你的逻辑中检查这一点,例如,你有一个待办事项的数据库,那么你的viewModel逻辑中就有这个状态(可能是StateFlow)