import 'package:flutter/material.dart'; import '../services/auth/auth.dart'; import '../pages/home.dart'; import '../pages/splash.dart'; import '../pages/login.dart'; class ReflexRouterDelegate extends RouterDelegate with ChangeNotifier, PopNavigatorRouterDelegateMixin { @override GlobalKey get navigatorKey => _navigatorKey; final GlobalKey _navigatorKey; bool? _loggedIn; bool? get loggedIn => _loggedIn; set loggedIn(value) { _loggedIn = value; notifyListeners(); } final AuthService authService; ReflexRouterDelegate(this.authService) : _navigatorKey = GlobalKey() { _init(); } _init() async { try { await authService.init(); loggedIn = await authService.isLoggedIn(); } catch (e) { showDialog( context: navigatorKey.currentContext!, builder: (context) => AlertDialog( title: Text('Error'), content: Text('Error: $e'), ), ); loggedIn = false; } } @override Widget build(BuildContext context) { List stack; if (loggedIn == null) { stack = _splashStack; } else if (loggedIn!) { stack = _loggedInStack; } else { stack = _loggedOutStack; } return WillPopScope( onWillPop: () async => !await navigatorKey.currentState!.maybePop(), child: Navigator( key: navigatorKey, pages: stack, onPopPage: (route, result) { if (!route.didPop(result)) return false; return true; }, )); } List get _splashStack => [const SplashPage()]; List get _loggedOutStack => [ LoginPage(onLogin: () { loggedIn = true; }) ]; List get _loggedInStack { return [ HomePage(onLogout: () { loggedIn = false; }), ]; } @override Future setNewRoutePath(configuration) async {/* Do Nothing */} }