TL; DR
Как мне поступить с действиями, которые активно изменяют данные (например, через EditText)? Сохраняю ли я их состояние в SavedInstanceState по очереди и использую ViewModel только тогда, когда все поля готовы, или есть ли способ сделать ViewModel ответственным за проверку / хранение / использование данных пользовательского интерфейса?
Вопрос
Я разрабатываю свое приложение, используя Google Arch. Компоненты, и когда я писал свой последний класс, я заметил, что не совсем уверен, что лучше всего использовать, например, данные, поступающие из формы Activity.
Пример
У меня есть POJO из заголовка, описания, местоположения, типа
У меня есть активность с четырьмя правками: title_et
, description_et
, location_et
, type_et
.
Моя ViewModel через репозиторий (не имеет значения здесь) может отправлять объект в базу данных при вызове функции sendObject
.
Как я это делаю сейчас
Активность имеет mTitle
, mDescription
, mLocation
, mType
.
При повороте действие сохраняет все значения EditText в пакете savedInstanceState
и загружает их снова, заполняя представления.
Когда пользователь хочет отправить объект, он нажимает кнопку, и после необходимых проверок действие вызывает функцию viewModel.sendObject(mTitle, mDescription, mLocation, mType)
.
Проблемы с этим подходом
Операция отвечает за хранение / проверку всех данных EditTexts, в основном делая ViewModel ответственным только за взаимодействие с репозиторием.
Чего бы я хотел достичь
В идеале я бы хотел, чтобы Activity была ответственна только за пользовательский интерфейс, делегируя все в ViewModel.
Таким образом, я могу позвонить sendObject()
, и ViewModel уже будет иметь все необходимые данные.
Ситуация с LiveData
Прямо сейчас ViewModel имеет только один экземпляр LiveData, внутри которого есть Ресурс (который взят отсюда ), и он используется, чтобы «сообщить» Деятельности, что поступили новые данные или произошла ошибка произошло.
Этот подход прекрасно работает во всех видах деятельности, которые просто получают данные из сети и отображают их. Что мне делать, когда я хочу синхронизировать данные, поступающие из активности? Должен ли я использовать одну LiveData для каждого поля и использовать ее для отображения потенциальных ошибок?
Я прочитал большинство примеров , но все действия там пассивны.
Заключение
Спасибо всем, кто нашел время, чтобы помочь.