Обработка ввода с помощью компонентов архитектуры Android - PullRequest
0 голосов
/ 01 мая 2018

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 для каждого поля и использовать ее для отображения потенциальных ошибок?

Я прочитал большинство примеров , но все действия там пассивны.

Заключение

Спасибо всем, кто нашел время, чтобы помочь.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете иметь LiveData вашей модели в ViewModel и изменять его из View (Activity / UI). Недостатком является то, что для обновления LiveData необходимо скопировать всю модель, отредактировать ее и опубликовать обратно в оперативные данные.

Второй способ - разделить компоненты модели в ViewModel на отдельные параметры LiveDatas. Позже, когда форма отправлена, вы можете реконструировать модель.

Что вы можете сделать для собственных полей - это использовать привязку данных. Для других вам нужно вручную обновить LiveData из View со слушателями и т. Д.

0 голосов
/ 01 мая 2018

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

...