Flutter go_router package redirects not works properly

Viewed 618

according to this official video from author of go_router package :

Flutter Navigator 2.0 made easy with go_router

and this Flutter Navigator 2.0: Using go_router complete guide , I implemnted go_router in my app. However, I'm having a strange problem. Everything works properly the first time I run my app. I can fetch user information from the server and send them to the home page. However, I'm getting an issue regarding fetching data after restarting my app. Would you please tell me why I'm receiving this error?

this my main.dart :

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final sharedPrefs = await SharedPreferences.getInstance();
  runApp(MyApp(sharedPrefs));
}

class MyApp extends StatefulWidget {
  final SharedPreferences sharedPreferences;
  MyApp(this.sharedPreferences);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late LoginState loginState;
  late Auth auth;
  @override
  void initState() {
    loginState = LoginState(widget.sharedPreferences);
    auth = Auth(widget.sharedPreferences);

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          ChangeNotifierProvider(
            create: (ctx) => auth,
          ),
          ChangeNotifierProvider(
            create: (ctx) => loginState,
          ),
          ChangeNotifierProvider(
            create: (ctx) => AppRouter(loginState),
          ),
          ListenableProxyProvider<Auth, Orders>(
            update: (_, authObj, prevOrders) =>
                Orders(authObj.usrName, authObj.objId),
          ),
          ListenableProxyProvider<Auth, FavMeals>(
            update: (_, authObj, prevOrders) =>
                FavMeals(authObj.usrName, authObj.objId),

        ],
        child: Sizer(builder: (context, orientation, deviceType) {
          final _router = Provider.of<AppRouter>(context, listen: false).router;
          return MaterialApp.router(
            routerDelegate: _router.routerDelegate,
            routeInformationParser: _router.routeInformationParser,
            scaffoldMessengerKey: scaffoldMessengerKey,
            theme: ThemeData(
       
                primarySwatch: myMaterialColor),
            localizationsDelegates: [
              GlobalCupertinoLocalizations.delegate,
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
            ],


          );
        }));
  }
}

and here is my router.dart file :

class AppRouter with ChangeNotifier {
  final LoginState authState;
  AppRouter(this.authState);
  late final router = GoRouter(
    redirect: (state) {
      final loginLoc = state.namedLocation(authScreen);
      // 2
      final loggingIn = state.subloc == loginLoc;
      // 3

      // 4
      final loggedIn = authState.loggedIn;
      final rootLoc = state.namedLocation(root);

      // 5
      if (!loggedIn && !loggingIn) return loginLoc;
      if (loggedIn && (loggingIn)) return rootLoc;
      return null;
    },
    refreshListenable: authState,
    routes: [
      GoRoute(
        name: root,
        path: '/',
        builder: (context, state) => TabsScreen(),
      ),
      GoRoute(
        name: mainScreen,
        path: '/main-screen',
        builder: (context, state) => HomeScreen(),
      ),
      GoRoute(
        name: splashScreen,
        path: '/splash-screen',
        builder: (context, state) => SplashScreen(),
      )
      GoRoute(
        name: authScreen,
        path: '/auth-screen',
        builder: (context, state) => AuthScreen(),
      ),
      GoRoute(
        name: orderSreen,
        path: '/order-screen',
        builder: (context, state) => OrderScreen(),
      ),
    
    ],
    errorBuilder: (context, state) => Scaffold(
      body: Center(
        child: Text(state.error.toString()),
      ),
    ),
  );
}

there is a method in my app within my '/' (root) screen that trying to fetch user data and then load the screen, this method doesnt work properly any more after I migrate to go_router :

  @override
  void initState() {
    _selectedIndex = 0;

    _pageController = PageController(initialPage: _selectedIndex!);


    initUserStatus().then((_) {
      setState(() {
        _isloading = false;
      });
    }, onError: (error) {
      GoRouter.of(context).goNamed(noNetwork);
      print(error.toString());
    });

    super.initState();
  }

  Future<void> initUserStatus() async {
    final userProvider = Provider.of<Users>(context, listen: false);
    await userProvider.userRetrieving();
    await Provider.of<EatenMeals>(context, listen: false).serverList();

    var user = userProvider.initialUser;
    dailyLimitAlert(user);
    if (user.isPremium) {
      var sub = await userProvider.subRemainDays();

      if (sub < 1) {
        await userProvider.changePremiumStatus();
      }
    } else {
      print(user.isPremium);
    }
  }
0 Answers
Related