如何在jetpack compose中创建自定义rememberState?

Jee*_*cha 3 android android-jetpack-compose

我们可以创建自己的custom rememberState喜欢的吗rememberModalButtomSheetSTate()?另外,我想将可组合项存储在 RememberState 中,并能够使用此状态设置和访问可组合项。喜欢rememberState.setCompose = @ComposablerememberState.getComposable

Thr*_*ian 6

是的,您可以创建容易记住的函数,例如rememberModalBottomSheetStaterememberLazyListState。创建存储多种数据类型的自定义记忆函数MutableState很常见。放置可组合项并不常见,至少到目前为止我还没有见过,但它是可行的。

class MyState internal constructor() {
   var state1 by mutableStateOf(0)
   var state2 by mutableStateOf(0)
   var someValue = 0
}
Run Code Online (Sandbox Code Playgroud)

内部构造函数是可选的,它用于限制开发人员只能通过remember函数创建实例。

// you can add params to pass to MyState instance or keys to reset remember
@Composable
fun rememberMyState(key1: Any?): MyState {
    return remember(key1) {
        MyState()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想添加可组合项,一种方法是

class MyState internal constructor() {
    var state1 by mutableStateOf(0)
    var state2 by mutableStateOf(0)
    var someValue = 0
    // this can also be SnapshoStateList to trigger recomposition when you add, remove or update list with new item instance
    val list = mutableListOf<@Composable () -> Unit>()
}
Run Code Online (Sandbox Code Playgroud)

用法

val myState = rememberMyState(key1 = Unit)
myState.list.add {
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(100.dp)
            .background(Color.Red)
    )
}

myState.list.add {
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(100.dp)
            .background(Color.Yellow)
    )
}

Column(modifier = Modifier.fillMaxSize()) {
    myState.list.forEach{
        it.invoke()
    }
}
Run Code Online (Sandbox Code Playgroud)