Sichere Möglichkeit, Findnavcontroller zu rufen.Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Sichere Möglichkeit, Findnavcontroller zu rufen.

Post by Anonymous »

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>

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;
}
wird ausgelöst, wenn diese Zeile findFragment.ParentfragmentManager ausführt.

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}")
}
}
Bitte zeigen Sie mich in die richtige Richtung, um besser zu verstehen, was abgedeckt werden soll, um solche Fälle von Ausnahmen zu vermeiden.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post