Как получить и подготовить данные перед отображением составного объекта?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить и подготовить данные перед отображением составного объекта?

Сообщение Anonymous »

Как в Jetpack Compose правильно получить все необходимые данные перед созданием составного объекта, используемого для редактирования этих данных?
Что у меня есть? представляют собой два составных объекта, один из которых должен получать все необходимые данные, которые должны отображаться, дочерний элемент должен позволять пользователю редактировать эти данные через элементы формы.
Данные извлекаются в модели представления и сохраняются локально в дочерний элемент можно компоновать как 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»