Как выполнить сетевой запрос при выходе из фрагмента? - PullRequest
0 голосов
/ 24 сентября 2019

Как удобно выполнить сетевой запрос при выходе из одного фрагмента с помощью Coroutines и ViewModel?

Рабочий процесс: пользователь вводит фрагмент A, содержащий список имен ящиков.Он выбирает один и перемещается к Фрагменту B, где он может сканировать штрих-коды, которые добавляются в выбранный ящик (в памяти).При сканировании всех необходимых штрих-кодов он нажимает кнопку «Назад», и в этот момент упомянутое поле со штрих-кодами должно быть отправлено на сервер (конечно, сериализовано в JSON).

ViewModelScope, конечно, не является решением, так как ViewModel фрагмента B очищается.Я пытался использовать WorkManager, но не могу понять, как это сделать удобно - для этого требуется передать ссылку на Context в ViewModel (чего я бы хотел избежать, чтобы очистить ViewModel от ссылок на платформу Android и упростить модульные тесты) и пройтиa Box, использующий объект Data.

Есть ли лучшее решение?

1 Ответ

1 голос
/ 24 сентября 2019

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

Вы можетеполучить общий ViewModel по следующему методу

activity?.let {
sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
}

Бонусная точка

Несмотря на то, что ОП не хочет использовать ViewModel, ограниченную графиком, он считается болееидеальный подход.Вот как вы можете получить ViewModel для графика

graph scoped viewModel example image

val viewModel: CheckoutViewModel by navGraphViewModels(R.id.checkout_graph)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...