Status Update
Comments
ap...@google.com <ap...@google.com> #2
So there does seem to be a bug in Navigation that causes this to fail.
When it navigates with popUpTo
and removes SecondFragment
, that removal in fragment is set for a frame later and before it is actually removed the navigate call in the onViewCreated
of SecondFragment
enqueues another call to add it back. But we still need to destroy SecondDetailFragment
which ends up marking the NavBackStackEntry
associated with SecondFragment
as complete before navigation has received the call from the fragment that it has been added back. So by the time it hits this check, the SecondFragment
is in the correct state, but Navigation has no way of referencing it so it assumes that it is not associated with an entry.
But this is not the way this type of situation should be implemented. Instead of having the destinations as part of the NavGraph, they should:
- be managed by the childFragmentManager of
SecondFragment
. So instead of going back toSecondFragment
just to go somewhere else, each of the fragments take the entire content ofSecondFragment
and are swapped out. - for some sort of a/b testing, set different graphs in the Activity. The graphs would keep the same
SecondFragment
id, but swap out the names and then you choose the correct graph based on the condition.
Description
Component used: Fragment
Allow developers to detect when they are reusing a fragment instance after it was previously removed from a FragmentManager (i.e., that
initState()
was called).Ideally, this should also change the
require***()
methods to change their error message based on whether the fragment was never added (the current error message) or if it was previously added but has since been removed (a new error message).This would probably have to hook into both the
FragmentTransaction
methods for adding a fragment (to provide better stack traces) as well as in the internaladdFragment()
to ensure that Fragments that were removed as part of an inflight transaction are properly caught.