Sichere Möglichkeit, Findnavcontroller zu rufen.
Posted: 11 Apr 2025, 12:18
Wir haben kürzlich eine Ausnahme erhalten, bei der ein findnavcontroller.navigate () Anruf aus einem Fragment gemacht wurde, das dabei zu zerstören scheint, während ein anderer (der neue/obere) erstellt wurde. Teil: < /p>
wird ausgelöst, wenn diese Zeile findFragment.ParentfragmentManager ausführt.
Bitte zeigen Sie mich in die richtige Richtung, um besser zu verstehen, was abgedeckt werden soll, um solche Fälle von Ausnahmen zu vermeiden.
Code: Select all
@NonNull
public final FragmentManager getParentFragmentManager() {
FragmentManager fragmentManager = mFragmentManager;
if (fragmentManager == null) {
throw new IllegalStateException(
"Fragment " + this + " not associated with a fragment manager.");
}
return fragmentManager;
}
Code: Select all
@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>
Ich habe hier auf S.O. einige Beiträge gelesen. das schlug vor, so etwas wie: < /p>
view?.post {
findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToLoginFragment())
}
< /code>
Kann dies zu unbeabsichtigten Problemen führen, wenn die Ansicht bereits null oder das Fragment bereits abgelöst ist? So etwas wie: < /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}")
}
}