Hello i'm new to flutter and although i have already searched on this topic, it is unclear to me. So here is the code:
main.dart file
RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await DotEnv().load('.env');
final UserRepository userRepository = new UserRepository();
runApp(BlocProvider(
create: (context) => AuthenticationBloc(userRepository)..add(AppStarted()),
child: App(
userRepository: userRepository
),
));
}
profile_form.dart (is on another file and imports the routeObserver from main.dart)
class ProfileForm extends StatefulWidget {
final UserRepository _userRepository;
final User _user;
ProfileForm(
{Key key, @required UserRepository userRepository, @required User user})
: assert(userRepository != null && user != null),
_userRepository = userRepository,
_user = user,
super(key: key);
State<ProfileForm> createState() => _ProfileFormState();
}
class _ProfileFormState extends State<ProfileForm> with RouteAware {
UserRepository get _userRepository => widget._userRepository;
User get _user => widget._user;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
routeObserver.subscribe(this, ModalRoute.of(context));
super.didChangeDependencies();
}
@override
void didPush() {
print('didPush FirstPage');
}
@override
void didPopNext() {
print('didPopNext FirstPage');
}
@override
void didPop() {
print('didPop FirstPage');
}
@override
void didPushNext() {
print('didPushNext FirstPage');
}
@override
void dispose() {
print("dis");
routeObserver.unsubscribe(this);
super.dispose();
}
}
This form is entered through the Navigator.pushReplacementNamed(context, '/profile'); Although the trigger of didPush() event fires when i go back to another page (again from Nanigator or back button) and waiting for the didPop() event to fire it does not. What do i miss here? My main problem is that i want to save changes when the user exits the profile screen but before entering the init of another screen.
I had a similar problem so if this can help anyone, here's what caused it. The problem was that the RouteObserver
that the RouteAware
was subscribing to, was a different one from the one that was used by MaterialApp
.
So the RouteObserver
in MaterialApp
was checking didPush
& didPop
events, but didn't have any listeners. The reason that you still get a didPush
event, is because the observer always sends a didPush
when you subscribe
.
The root cause in our case, was that we used a Provider
to provide the RouteObserver
to the RouteAware
widget, but everytime the MaterialApp
was rebuilt, it got a new RouteObserver
different from the one created by the provider.
Check if the RouteObserver
you are subscribing to is the same one that's being used by MaterialApp
, using the hashCode
property!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With