Max
Max

Reputation: 1301

The AutoRoute does not change when the state changes

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

Answers (1)

Evgeny
Evgeny

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

Related Questions