Что у меня есть? представляют собой два составных объекта, один из которых должен получать все необходимые данные, которые должны отображаться, дочерний элемент должен позволять пользователю редактировать эти данные через элементы формы.
Данные извлекаются в модели представления и сохраняются локально в дочерний элемент можно компоновать как RememberSaveable() во время редактирования:
ViewModel содержит:
Код: Выделить всё
private val _userFetchedForEditing = MutableStateFlow(null)
val userFetchedForEditing: StateFlow = _userFetchedForEditing.asStateFlow()
fun fetchUserForEditingByName(name: String) {
_userFetchedForEditing.value = null
viewModelScope.launch {
_userFetchedForEditing.value = userRepository.getUserByName(name).firstOrNull()
}
}
Код: Выделить всё
composable(
route = "${Screen.UserEditor.route}?userName={userName}",
arguments = listOf(navArgument("userName") {
type = NavType.StringType
nullable = false
}),
) { navBackStackEntry ->
val userName: String? = navBackStackEntry.arguments?.getString("userName")
LaunchedEffect(userName) {
userName?.let { viewModel.fetchUserForEditingByName(it) }
}
val userFetchedForEditing by viewModel.userFetchedForEditing.collectAsState()
if (userFetchedForEditing == null) {
LoadingScreen()
} else {
UserEditor(viewModel, navController, modifier, userFetchedForEditing)
}
}
Код: Выделить всё
@Composable
private fun UserEditor(
viewModel: MainViewModel,
navController: NavHostController,
modifier: Modifier = Modifier,
givenInput: User? = null,
) {
var editableInputUser by rememberSaveable(saver = userSaver) {
mutableStateOf(givenInput ?: User())
}
//this causes a visible screen refresh of the shown user after a couple milliseconds, but is needed or the editableInputUser is not updated to the givenInput sometimes
LaunchedEffect(givenInput) {
editableInputUser = givenInput ?: User()
}
UserEditorForm(
//takes editableInputUser and displays forms for updating values
)
}
Каким образом можно было бы разрешить отображение и редактирование пользователя с помощью Jetpack Compose?
В настоящее время мне кажется, что мне приходится злоупотреблять LaunchedEffect, чтобы перетащить отображаемые данные в то, что должно отображаться.
Подробнее здесь: https://stackoverflow.com/questions/791 ... composable
Мобильная версия