Home > other >  What the differents variables will be destructured when I use rememberSaveable?
What the differents variables will be destructured when I use rememberSaveable?

Time:10-27

The Code A is from offical sample code here.

The code val (currentSection, updateSection) = rememberSaveable { mutableStateOf(tabContent.first().section) } will create two variables, one is currentSection, another is updateSection.

According to the Hint of Android Studio, I find the following definition

val currentSection: Sections

val updateSection: (Sections) → Unit

I read the source code of both tabContent and rememberSaveable, but I can't understand why the rememberSaveable can destructure it to two different variables (Sections And (Sections) → Unit). Why can't the rememberSaveable destructure it to three different variables with other types?

Code A

@Composable
fun InterestsRoute(
    interestsViewModel: InterestsViewModel,
    isExpandedScreen: Boolean,
    openDrawer: () -> Unit,
    scaffoldState: ScaffoldState = rememberScaffoldState()
) {
    val tabContent = rememberTabContent(interestsViewModel)
    val (currentSection, updateSection) = rememberSaveable {
        mutableStateOf(tabContent.first().section)
    }

    InterestsScreen(
        tabContent = tabContent,
        currentSection = currentSection,
        isExpandedScreen = isExpandedScreen,
        onTabChange = updateSection,
        openDrawer = openDrawer,
        scaffoldState = scaffoldState
    )
}

@Composable
fun rememberTabContent(interestsViewModel: InterestsViewModel): List<TabContent> {
   ...
   return listOf(topicsSection, peopleSection, publicationSection)
}


class TabContent(val section: Sections, val content: @Composable () -> Unit)

CodePudding user response:

The destructing that you are referring to has actually nothing to do with rememberSaveable. The rememberSaveable { mutableStateOf(...) } function returns a MutableState and this is what can be destructured.

interface MutableState<T> : State<T> {
    override var value: T
    operator fun component1(): T
    operator fun component2(): (T) -> Unit
}

Here you can see the two components that you are referring to ( T and (T) -> Unit)

  • Related