#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
, если вы сделаете его avar
. В моем коде я использовал aval
, поэтому мне нужноupdateCount
было обновить изменяемое состояние.5. На ваш вопрос о том, является ли это встроенной функцией, вот раздел из реализации MutableState . Эти функции компонента были переопределены здесь.