如何通过委托使用 mutableState 并使其可传递给另一个函数?

Ely*_*lye 6 android android-jetpack-compose

我有一个可组合的功能,一个按钮将切换显示文本和隐藏它

@Composable
fun Greeting() {
    Column {
        val toggleState = remember {
            mutableStateOf(false)
        }
        AnimatedVisibility(visible = toggleState.value) {
            Text(text = "Edit", fontSize = 64.sp)
        }
        ToggleButton(toggleState = toggleState) {}
    }
}

@Composable
fun ToggleButton(modifier: Modifier = Modifier,
                 toggleState: MutableState<Boolean>,
                 onToggle: (Boolean) -> Unit) {


    TextButton(
        modifier = modifier,
        onClick = {
            toggleState.value = !toggleState.value
            onToggle(toggleState.value)
        })
    { Text(text = if (toggleState.value) "Stop" else "Start") }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢该代码的一件事是val toggleState = remember { ... }
我更喜欢val toggleState by remember {...}

但是,如果我这样做,如下所示,我将无法按照需要将其toggleState传递给ToggleButton,而不是传递给。因此它会出错。ToggleButtonmutableState<Boolean>Boolean


@Composable
fun Greeting() {
    Column {
        val toggleState by remember {
            mutableStateOf(false)
        }
        AnimatedVisibility(visible = toggleState) {
            Text(text = "Edit", fontSize = 64.sp)
        }
        ToggleButton(toggleState = toggleState) {} // Here will have error
    }
}

@Composable
fun ToggleButton(modifier: Modifier = Modifier,
                 toggleState: MutableState<Boolean>,
                 onToggle: (Boolean) -> Unit) {


    TextButton(
        modifier = modifier,
        onClick = {
            toggleState.value = !toggleState.value
            onToggle(toggleState.value)
        })
    { Text(text = if (toggleState.value) "Stop" else "Start") }
}
Run Code Online (Sandbox Code Playgroud)

如何在仍在使用的同时修复上述错误val toggleState by remember {...}

Gab*_*tti 4

Compose 中的状态提升是一种将状态移动到可组合项的调用者以使可组合项成为无状态的模式。Jetpack Compose 中状态提升的一般模式是用两个参数替换状态变量:

  • value: T:要显示的当前值
  • onValueChange: (T) -> Unit:请求更改值的事件,其中T建议的新值

你可以做类似的事情

// stateless composable is responsible 
@Composable
fun ToggleButton(modifier: Modifier = Modifier,
                 toggle: Boolean,
                 onToggleChange: () -> Unit) {
    
    TextButton(
        onClick = onToggleChange,
        modifier = modifier
    )
    { Text(text = if (toggle) "Stop" else "Start") }

}
Run Code Online (Sandbox Code Playgroud)

@Composable
fun Greeting() {

        var toggleState by remember { mutableStateOf(false) }

        AnimatedVisibility(visible = toggleState) {
            Text(text = "Edit", fontSize = 64.sp)
        }
        ToggleButton(toggle = toggleState,
            onToggleChange = { toggleState = !toggleState }
        )
}
Run Code Online (Sandbox Code Playgroud)

您还可以添加相同的有状态可组合项,它仅负责保存内部状态:

@Composable
fun ToggleButton(modifier: Modifier = Modifier) {

    var toggleState by remember { mutableStateOf(false) }

    ToggleButton(modifier,
        toggleState,
        onToggleChange = {
            toggleState = !toggleState
        },
    )
}
Run Code Online (Sandbox Code Playgroud)