Назначение навигации, неизвестное этому NavController после результата действия - PullRequest
0 голосов
/ 30 августа 2018

Я использую Nav Controller 1.0.0alpha05, и он отлично работает, но я борюсь с этой ужасной ошибкой, когда выполняю навигационное действие после результата действия.

У меня есть структура с одним действием / несколькими фрагментами, в частности фрагмент со списком элементов и еще один с формой для добавления нового.

Когда я добавляю еще один без какого-либо изображения, он работает и возвращается к предыдущему со списком элементов, но когда я делаю несколько фотографий, я получаю исключение во время навигации.

Вызвано: java.lang.IllegalArgumentException: пункт назначения навигации XX неизвестен этому NavController

Журнал ошибок

График навигации фрагмента формы, содержащего действие:

<fragment
    android:id="@+id/idFormFragment"
    android:name="FormFragment"
    android:label="FormFragment"
    tools:layout="@layout/form_fragment">
    <argument
        android:name="idClient"
        android:defaultValue="-1"
        app:argType="integer" />
    <argument
        android:name="idServer"
        app:argType="string" />
    <action
        android:id="@+id/actionFormToList"
        app:destination="@id/idListFragment" />
</fragment>

Код вызова действия с безопасными аргументами

FormFragmentDirections.ActionFormToList action = new FormFragmentDirections.ActionFormToList(sample.getIdJob());
Navigation.findNavController(getView()).navigate(action);

Спасибо за ваше время

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Ну, мне удалось найти нелепое решение ...

Предполагая, что вы используете фрагмент навигации хоста, который простирается от NavHostFragment, добавьте в него код (Kotlin):

/*
 * begin DUMB Navigation Component hack
 *
 * This fixes an IllegalArgumentException that can sometimes be thrown from within the
 * Navigation Architecture Component when you try to navigate after the Fragment has had its
 * state restored. It occurs because the navController's currentDestination field is null,
 * which stores where we currently are in the navigation graph. Because it's null, the
 * Navigation Component can't figure out our current position in relation to where we're
 * trying to navigate to, causing the exception to be thrown.
 *
 * This fix gives the navController a little nudge by gently setting it to where we currently
 * are in the navigation graph.
 *
 * This fix is verified as both working AND necessary as of Navigation Components version
 * 1.0.0-alpha07.
 *
 * There's a tiny bit more information at this thread, but it's pretty limited:
 * /10213646/naznachenie-navigatsii-neizvestnoe-etomu-navcontroller-posle-rezultata-deistviya
 */
private var checkCurrentDestination = false

override fun onStart() {
    super.onStart()

    if (checkCurrentDestination && navController.currentDestination == null) {
        navController.navigate(navController.graph.startDestination)
    }

    checkCurrentDestination = false
}

override fun onStop() {
    super.onStop()
    checkCurrentDestination = true
}
/*
 * end DUMB Navigation Component hack
 */

В усилиях SEO трассировка стека будет выглядеть так:

Caused by: java.lang.IllegalArgumentException: navigation destination XX is unknown to this NavController
0 голосов
/ 31 августа 2018

Я нашел обходной путь, но, очевидно, я не могу считать это решением:

Я думаю, что когда восстанавливается состояние экземпляра фрагмента, связь с действиями nav_graph, связанного с таким фрагментом, каким-то образом теряется или что-то в этом роде ... Но я могу ошибаться

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

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

Bundle args = new Bundle();
args.putString(ID_ARG, arg);
Navigation.findNavController(getView()).navigate(R.id.fragmentId, args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...