Форма создания Android Jetpack с управлением состоянием класса

У меня есть простой класс 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 с чистым и структурированным кодом?

1
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не хватает некоторых важных частей этой головоломки. Вам необходимо хранить значения каждого User либо в List<User> для краткосрочного использования, либо в базе данных для долгосрочного использования.

Я рекомендую базу данных, чтобы у вас был долгосрочный доступ к вашим данным в различных состояниях, которые может пройти ваше приложение. Вы можете узнать все об этом с помощью этого руководства по комнате, которая является лучшим способом реализации постоянной структуры данных с помощью ViewModel.

Это позволит вам хранить и позже получать доступ к данным User.

У меня есть база данных firestore, это форма для обновления пользовательских полей, поэтому я должен взять объект пользователя из базы данных по его идентификатору

Michele Verriello 11.04.2023 15:50

Тогда это скорее вопрос Firestore/Firebase. Вы должны обновить свои теги, чтобы забросить сеть в правильный пруд.

Robert Jamison 11.04.2023 23:24
Ответ принят как подходящий

Я вижу несколько способов сделать это. Ваш первоначальный код не выглядит так, как будто он может развиваться в хорошем направлении. Однако обратите внимание на следующие изменения:

Избегайте строковой зависимости в 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, как только я вошел в систему, мне нужен идентификатор (строка), чтобы получить пользователя. Итак, как я могу избежать зависимости от строки? Согласно документации, я должен всегда передавать идентификатор при переходе от одного представления к другому (используя панель навигации).

Michele Verriello 11.04.2023 15:49

Compose следует правилу одного действия/нескольких компонуемых. Таким образом, вы можете объявить модель представления верхнего уровня для использования во всем приложении, если это тот ответ, который вы ищете. Другой вариант — кэширование пользовательских данных в Room.

Nishant Jalan 11.04.2023 16:55

Другие вопросы по теме