zoha131
12/22/2020, 3:46 AMAdam Powell
12/22/2020, 3:55 AMwithMutableSnapshot
will let you commit several snapshot state changes atomically and compose will see it as a single change. In some cases it's redundant or overkill though, what's your use case?zoha131
12/22/2020, 4:24 AMModalBottomSheetLayout
and I have to show different BottomSheet
based on user action. Now if i change the bottomSheetState
first then I can’t get the updated other state inside the sheetBlock
zoha131
12/22/2020, 4:26 AMsealed class StudentEditSheet{
object Email: StudentEditSheet()
object Gender: StudentEditSheet()
object Department: StudentEditSheet()
object Level: StudentEditSheet()
object Term: StudentEditSheet()
object None: StudentEditSheet()
}
@ExperimentalComposeApi
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun StudentEditScreen(
viewModel: StudentEditViewModel,
onBackPress: (() -> Unit)?,
onNavigateToHome: () -> Unit
) {
val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
var studentEditSheet by remember { mutableStateOf<StudentEditSheet>(StudentEditSheet.None) }
ModalBottomSheetLayout(
sheetState = sheetState,
sheetContent = {
when (studentEditSheet) {
StudentEditSheet.Gender -> {
ListBottomSheet(
title = stringResource(id = R.string.select_your_department),
icon = Icons.Outlined.DepartureBoard,
onClose = { studentEditSheet = StudentEditSheet.None },
list = (0..9).toList(),
onItemClick = { }
)
}
else -> {
Box(modifier = Modifier.size(100.dp))
}
}
}
) {
StudentEditScreenContent(
stateFlow = viewModel.state,
onFullNameChange = viewModel::changeFullName,
onDiuIdChange = viewModel::changeDiuId,
selectGender = {
withMutableSnapshot {
sheetState.show()
studentEditSheet = StudentEditSheet.Gender
}
},
onEmailClick = { studentEditSheet = StudentEditSheet.Email },
onPhoneChange = viewModel::changePhoneNumber,
selectDepartment = { studentEditSheet = StudentEditSheet.Department },
selectLevel = { studentEditSheet = StudentEditSheet.Level },
selectTerm = { studentEditSheet = StudentEditSheet.Term },
changeImage = {},
saveStudentProfile = viewModel::saveProfile,
onBackPress = onBackPress
)
}
}
zoha131
12/22/2020, 4:38 AMAdam Powell
12/22/2020, 4:56 AMChoreographer
frame synced to the device's vsync interval; if you make two changes in the same event handler it's basically as good as putting it inside a withMutableSnapshot
block anywayAdam Powell
12/22/2020, 4:57 AMChoreographer
work also happens on the same thread as the event callbacks; they cannot run concurrently)zoha131
12/22/2020, 5:16 AMstudentEditSheet = StudentEditSheet.Gender
sheetState.show()
but I have the same effect. It ignores the first tap.Adam Powell
12/22/2020, 5:19 AMzoha131
12/22/2020, 5:20 AMJózsef Szilvási
01/15/2021, 7:18 AMzoha131
01/15/2021, 4:36 PM