Hi, is there a way to combine `Saver`? I would lik...
# compose
l
Hi, is there a way to combine
Saver
? I would like to save a class looking like this:
class TextFieldState(query: TextFieldValue, enable: Boolean, error: Boolean, focused: Boolean)
I tried a custom Saver implementation (in 🧵) but it doesn't work as TextFieldValue should have it's own Saver.
solved 1
👀 1
Copy code
@Composable
fun rememberTextFieldState(
    query: TextFieldValue = TextFieldValue(),
    enable: Boolean = false,
    error: Boolean = false,
    focused: Boolean = false,
): TextFieldState = rememberSaveable(saver = TextFieldStateSaver) {
    TextFieldState(
        query = query,
        enable = enable,
        error = error,
        focused = focused,
    )
}

val TextFieldStateSaver = listSaver<TextFieldState, Any>(
    save = {
        listOf(
            it.query,
            it.enable,
            it.error,
            it.focused,
        )
    },
    restore = {
        TextFieldState(
            it[0] as TextFieldValue,
            it[1] as Boolean,
            it[2] as Boolean,
            it[3] as Boolean
        )
    }
)

@Stable
class TextFieldState(
    query: TextFieldValue,
    enable: Boolean,
    error: Boolean,
    focused: Boolean,
) {
    var query by mutableStateOf(query)
    var enable by mutableStateOf(enable)
    var error by mutableStateOf(error)
    var focused by mutableStateOf(focused)

    fun displayError() = error && focused.not()
}
a
You can just call other savers:
Copy code
val Saver = listSaver(
    save = {
        listOf(
            with(TextFieldValue.Saver) { save(it.query) },
            it.enable,
            it.error,
            it.focused,
        )
    },
    restore = {
        TextFieldState(
            TextFieldValue.Saver.restore(it[0])!!,
            it[1] as Boolean,
            it[2] as Boolean,
            it[3] as Boolean
        )
    }
)
l
Ah nice 👍 I didn't think of it, thank you!