Reputation: 1301
For routing, I use auto_route
and added listening to changes through the provider reevaluateListenable: authProvider
but when my provider value changes, nothing happens, why doesn’t listening to changes work and they don’t open another page?
main
Widget build(BuildContext context) {
return Consumer<AuthProvider>(
builder: (context, authProvider, child) {
return MaterialApp.router(
theme: darkTheme,
routerConfig: _appRouter.config(
reevaluateListenable: authProvider,
navigatorObservers: () => [
TalkerRouteObserver(
GetIt.I<Talker>(),
),
],
),
title: 'Flutter Demo',
);
},
);
}
authguard
class AuthGuard extends AutoRouteGuard {
@override
void onNavigation(NavigationResolver resolver, StackRouter router) async {
final AuthProvider appState = AuthProvider();
if (appState.isLoggedIn) {
resolver.next(true);
} else {
resolver.redirect(const AuthRoute());
}
}
}
authprovider
class AuthProvider extends ChangeNotifier implements Listenable {
bool _isLoggedIn = false;
bool get isLoggedIn => _isLoggedIn;
void login() {
_isLoggedIn = true;
notifyListeners();
}
void logout() {
_isLoggedIn = false;
notifyListeners();
}
}
loginscreen
void onPressedMethod(bool isRegister) {
final authProvider = Provider.of<AuthProvider>(context, listen: false);
if (isRegister) {
authProvider.login();
} else {
authProvider.login();
}
}
Upvotes: 0
Views: 206
Reputation: 139
Instead reevaluateListenable, try update you AppRouter and reset router stack somewhere once auth state changed to guest
// AuthGuard
if (isLoggedIn || resolver.routeName == LoginRoute.name) {
resolver.next(true);
return;
}
resolver.redirect(const LoginRoute());
// AuthGuard
@LazySingleton() // injectable
class AppRouter extends RootStackRouter {
@override
List<AutoRoute> get routes => [
AdaptiveRoute(
initial: true,
page: TabBarRoute.page,
.....
)
];
@override
List<AutoRouteGuard> get guards => [
getIt<AuthGuard>(),
];
}
logout() {
getIt<AppRouter>().replaceAll([const TabBarRoute()]);
}
Upvotes: 0