Отвечая на мой собственный вопрос, когда я нашел правильный подход в обновленной навигационной документации.
На момент написания этого ответа я использую Navigation 2.2.0-alpha01
Если вы хотите пройтинекоторые данные в начальный пункт назначения непосредственно в качестве аргументов от активности хоста, вам нужно вручную установить граф навигации вашего хоста внутри метода onCreate () активности хоста, как показано ниже:
Get your navController:
val navController by lazy { findNavController(R.id.<your_nav_host_id>) }
Затем в действиях хоста onCreate()
val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)
Или, если вы хотите передать все дополнения к цели, как это, в startDestination:
navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)
С момента intent.extras
вернет Bundle
only
Когда вы устанавливаете navGraph с помощью метода setGraph (), вам следует избегать установки атрибута app: NavGraph в определении NavHostFragment, потому что это приводит к раздутию иустановка графика навигации дважды.
При чтении этих аргументов во фрагменте startDestination:
Если вы используете Плагин Safe Args (что очень рекомендуется), затем в вашем фрагменте:
private val args by navArgs<DummyFragmentArgs>()
Плагин Safe Args генерирует класс Args, добавляя Args к имени вашего фрагмента.Например, если ваш фрагмент называется DummyFragment
, тогда Safe Args сгенерирует класс с именем DummyFragmentArgs
, где navArgs<>
- это функция расширения, определенная в Android KTX
Если вы не используете Android KTX, вы можете получить объект args, например:
val args = DummyFragmentArgs.fromBundle(arguments!!)
После того, как вы приобрели объект arguments, вы можете просто получить свои аргументы:
args.someArgument
Обратите внимание, как мы передали "some_argument"
в качестве аргумента, и мы читаем его как someArgument
, используя Safe Args
Если вы не используете Safe Args (хотя нет причин не использовать его), выможете получить доступ к своим аргументам следующим образом:
arguments?.getString("some_argument")
Все это описано в документации по Миграция на компонент навигации здесь: https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment