Are you sure you want to navigate on state change? I never do that. (I'm not saying I'm right necessarily, though.) I just show a different widget on state change. If you try to navigate after a state change, what are you going to show if the user tries to navigate back to the the previous screen? For example, login. Rather than navigating to a new logged in screen, I would just rebuild with the new logged in screen.
When I need to navigate, I keep all of the navigation code in the UI layer. For example, when pushing a button, I put the push route code in the button callback method.
Note: I'm still not using Navigator 2.0 yet, because I can't understand it. However, theoretically it works better with this and other state management solutions. That is, you tell it the navigation state and it builds the route stack for you.