Безопасный способ назвать findnavcontroller.navigate/popbackstack во время отдельного состоянияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Безопасный способ назвать findnavcontroller.navigate/popbackstack во время отдельного состояния

Сообщение Anonymous »

Недавно мы получили исключение, в котором был сделан вызов findnavcontroller.navigate () , который был создан из фрагмента, который, по -видимому, был в процессе уничтожения, в то время как другой (новый/верхний) был создан. Часть: < /p>

Код: Выделить всё

@NonNull
public final FragmentManager getParentFragmentManager() {
FragmentManager fragmentManager = mFragmentManager;
if (fragmentManager == null) {
throw new IllegalStateException(
"Fragment " + this + " not associated with a fragment manager.");
}
return fragmentManager;
}
запускается, когда эта строка запускает findfragment.parentfragmentmanager.primaryNavigationFragment from:

Код: Выделить всё

    @JvmStatic
public fun findNavController(fragment: Fragment): NavController {
var findFragment: Fragment? = fragment
while (findFragment != null) {
if (findFragment is NavHostFragment) {
return findFragment.navHostController
}
val primaryNavFragment = findFragment.parentFragmentManager
.primaryNavigationFragment
if (primaryNavFragment is NavHostFragment) {
return primaryNavFragment.navHostController
}
findFragment = findFragment.parentFragment
}

// Try looking for one associated with the view instead, if applicable
val view = fragment.view
if (view != null) {
return Navigation.findNavController(view)
}

// For DialogFragments, look at the dialog's decor view
val dialogDecorView = (fragment as? DialogFragment)?.dialog?.window?.decorView
if (dialogDecorView != null) {
return Navigation.findNavController(dialogDecorView)
}
throw IllegalStateException("Fragment $fragment does not have a NavController set")
}
< /code>
Я прочитал несколько сообщений здесь на S.O. Это предполагало использовать что -то вроде: < /p>
view?.post {
findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToLoginFragment())
}
< /code>
Может ли это привести к непреднамеренным вопросам, если представление уже является нулевым или уже отдельно отстранен фрагмент? Что -то вроде: < /p>
fun Fragment.navigateSafely(directions: NavDirections) {
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
findNavController().navigate(directions)
} else {
Timber.d("Can't navigate to $directions, because lifecycle state is ${lifecycle.currentState}")
}
}
Пожалуйста, укажите мне в правильном направлении, чтобы лучше понять, что должно быть покрыто, чтобы избежать таких случаев исключений.

Подробнее здесь: https://stackoverflow.com/questions/795 ... ched-state
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»