Эквивалент startActivityForResult () с навигацией по архитектуре Android - PullRequest
0 голосов
/ 05 июня 2018

У меня рабочий процесс с 3 экранами.От «экрана 1» до доступа к «экрану 2» пользователь должен принять некие условия , которые я называю на своем изображении «модальными».Но он должен принять эти условия только один раз.В следующий раз, когда он находится на первом экране, он может перейти непосредственно к экрану 2. Пользователь может выбрать НЕ принимать условия, и поэтому мы возвращаемся к «экрану 1» и не пытаемся перейти к «экрану 2».

App workflow

Мне интересно, как это сделать с новым компонентом навигации .

Ранее, что бы я сделал это:

  • На экране 1 проверьте, должен ли пользователь принять условия
  • Если нет, запустите действие "экран 2"
  • Если да, используйте startActivityForResult() и дождитесь результата от модала.Отметьте условия как принятые.Старт "screen 2"

Но с графиком навигации нет возможности запустить фрагмент, чтобы получить результат.

Я мог бы пометить термины, принятые в "модальном""экран и запустить" экран 2 "оттуда.Дело в том, что для доступа к экрану 2 мне нужно сделать сетевой запрос.Я не хочу дублировать вызов API и обрабатывать его результаты как в «screen 1», так и в «модальном».

Есть ли способ вернуться с "модального" на "экран 1" с некоторой информацией (пользователь принял условия), используя навигацию Jetpack?

Редактировать: В настоящее время я обхожу это, используя тот же поток, который предлагает Яхья ниже: используя Activity только для модального и используя startActivityForResult из "экрана 1".Мне просто интересно, смогу ли я продолжать использовать график навигации для всего потока.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Существует несколько альтернатив модели общего представления.

  1. fun navigateBackWithResult (result: Bundle), как описано здесь https://medium.com/google-developer-experts/using-navigation-architecture-component-in-a-large-banking-app-ac84936a42c2

  2. Создатьобратный вызов.

ResultCallback.kt

interface ResultCallback : Serializable {
    fun setResult(result: Result)
}

Передать этот обратный вызов в качестве аргумента (обратите внимание, что он должен реализовывать Serializable, а интерфейс должен быть объявлен в своем собственномfile.)

<argument android:name="callback"
                  app:argType="com.yourpackage.to.ResultCallback"/>

Make framgent A реализует ResultCallback, фрагмент B by получает аргументы и передает данные обратно через них, args.callback.setResult (x)

0 голосов
/ 22 мая 2019

Существует еще один альтернативный способ.Вы можете использовать другое навигационное действие от модального обратно на screen1 вместо popBackStack().На этом действии вы можете отправить любые данные, которые вам нравятся, чтобы просмотреть один.Используйте эту стратегию, чтобы убедиться, что модальный экран не сохраняется в заднем стеке навигации: https://stackoverflow.com/a/54015319/4672107.

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

0 голосов
/ 08 августа 2018

Похоже, что сейчас не существует эквивалента для startActivityForResult в компоненте навигации.Но если вы используете LiveData и ViewModel, вас может заинтересовать эта статья .Автор использует видимость действия ViewModel и LiveData для достижения этого для фрагментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...