У меня есть простой класс Person, определенный следующим образом
data class User(
val id: String = "",
val name: String = "",
val surname: String = "",
...
)
Затем у меня есть класс ProfileViewModel, который имеет два метода.
getUserById()
и updateUser()
class ProfileViewModel(private val id: String): ViewModel() {
var user: User = User()
fun getUserById() { ... }
fun updateUser() { ... }
}
после этого у меня есть составная функция с формой, которая должна иметь возможность инициализировать пользовательские данные в поле формы, а затем обновлять их
@Composable
fun ProfileView(profileViewModel: ProfileViewModel() = viewModel()) {
Column () {
...
}
}
Я мог бы создать некоторую переменную в составной функции, а затем передать ее при выполнении userUpdate, но Как я могу выполнить эти операции, используя пользовательскую переменную в классе profileViewModel с чистым и структурированным кодом?
Вам не хватает некоторых важных частей этой головоломки. Вам необходимо хранить значения каждого User
либо в List<User>
для краткосрочного использования, либо в базе данных для долгосрочного использования.
Я рекомендую базу данных, чтобы у вас был долгосрочный доступ к вашим данным в различных состояниях, которые может пройти ваше приложение. Вы можете узнать все об этом с помощью этого руководства по комнате, которая является лучшим способом реализации постоянной структуры данных с помощью ViewModel
.
Это позволит вам хранить и позже получать доступ к данным User
.
Тогда это скорее вопрос Firestore/Firebase. Вы должны обновить свои теги, чтобы забросить сеть в правильный пруд.
Я вижу несколько способов сделать это. Ваш первоначальный код не выглядит так, как будто он может развиваться в хорошем направлении. Однако обратите внимание на следующие изменения:
Избегайте строковой зависимости в ViewModel
. Весь класс не зависит от строки. Даже если это так, ему не следует передавать параметр конструктора. Рассмотрите возможность использования таких технологий, как создание State
вашего ViewModel
и его правильная инкапсуляция.
class ProfileViewModel(): ViewModel() {
val user = mutableStateOf<User>(User.dummy()) // initial value
fun getUserById(id: String) { /* Fetch user and set user */ }
fun updateUser() { /* Send the user object to the domain layer */ }
}
Теперь вы можете загрузить текущие значения user
в составную функцию. По мере того, как клиент меняет свои данные, информация синхронизируется с ViewModel
.
Когда вы освоитесь с этим, подумайте, как вы можете инкапсулировать изменяемое состояние. Изменяемые объекты и переменные не должны открываться, поскольку другие части вашего кода могут изменять их без учета последствий.
Мне нужно инициализировать пользователя из firebase, как только я вошел в систему, мне нужен идентификатор (строка), чтобы получить пользователя. Итак, как я могу избежать зависимости от строки? Согласно документации, я должен всегда передавать идентификатор при переходе от одного представления к другому (используя панель навигации).
Compose следует правилу одного действия/нескольких компонуемых. Таким образом, вы можете объявить модель представления верхнего уровня для использования во всем приложении, если это тот ответ, который вы ищете. Другой вариант — кэширование пользовательских данных в Room.
У меня есть база данных firestore, это форма для обновления пользовательских полей, поэтому я должен взять объект пользователя из базы данных по его идентификатору