Что присваивается переменной updateSection в официальном примере кода?

#kotlin #android-jetpack-compose

Вопрос:

Код A взят из официального примера кода здесь.

val (currentSection, updateSection) = rememberSaveable { mutableStateOf(tabContent.first().section) } это объявление деструктурирования.

Понятно, что currentSection присваивается tabContent.first().section

Что присваивается переменной updateSection ? Будет ли оно присвоено tabContent.first().content ?

Код A

 @Composable
fun InterestsRoute(
   ...
) {
    val tabContent = rememberTabContent(interestsViewModel)
    val (currentSection, updateSection) = rememberSaveable {
        mutableStateOf(tabContent.first().section)
    }
    ...
}


@Composable
fun rememberTabContent(interestsViewModel: InterestsViewModel): List<TabContent> {  
    val uiState by interestsViewModel.uiState.collectAsState()
    val topicsSection = TabContent(Sections.Topics) {
        val selectedTopics by interestsViewModel.selectedTopics.collectAsState()
        TabWithSections(
            sections = uiState.topics,
            selectedTopics = selectedTopics,
            onTopicSelect = { interestsViewModel.toggleTopicSelection(it) }
        )
    }
     ...
    return listOf(topicsSection, peopleSection, publicationSection)
}


enum class Sections(@StringRes val titleResId: Int) {
    Topics(R.string.interests_section_topics),
    People(R.string.interests_section_people),
    Publications(R.string.interests_section_publications)
}

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

Ответ №1:

updateSection используется ли здесь лямбда-выражение для обновления значения изменяемого состояния. Рассмотрим этот пример:

 @Composable
fun MyButton() {
    val (count, updateCount) = remember { mutableStateOf(0) }
    Button(
        onClick = { updateCount(count 1) }
    ) {
        Text(text = "$count")
    }
}
 

Здесь count Int и updateCount (Int) -> Unit . updateCount принимает Int и обновляет значение MutableState ( count ) до указанного значения (здесь count 1 ).
Приведенный выше код обновляет текст count на единицу при каждом нажатии кнопки.

Возвращаясь к вашему коду, rememberSaveable { mutableStateOf (...) } создается новое изменяемое состояние. Его начальное значение будет tabContent.first().section . currentSection сохраняет значение этого изменяемого состояния (изначально оно будет tabContent.first().section ). Теперь, если вы хотите обновить значение этого изменяемого состояния, вы можете использовать updateSection лямбда. Просто вызовите это лямбда-выражение с новым значением, и currentSection оно будет обновлено автоматически.

Комментарии:

1. Спасибо! В вашем коде updateCount , (Int) -> Unit как вы можете знать, что функция updateCount обновит значение MutableState (count) ? Это встроенная функция Android Studio?

2. И многое другое, в вашем коде onClick = { updateCount(count 1) } эквивалентно onClick = { count=count 1 } , верно?

3. Итак, в некотором смысле, мне не нужна функция updateCount , я могу переназначить данные count самостоятельно напрямую, верно?

4. Вы можете напрямую переназначить на count , если вы сделаете его a var . В моем коде я использовал a val , поэтому мне нужно updateCount было обновить изменяемое состояние.

5. На ваш вопрос о том, является ли это встроенной функцией, вот раздел из реализации MutableState . Эти функции компонента были переопределены здесь.