Files
flutter-rp-example/lib/router/router.dart

96 lines
2.5 KiB
Dart

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<NavigatorState> get navigatorKey => _navigatorKey;
final GlobalKey<NavigatorState> _navigatorKey;
bool? _loggedIn;
bool? get loggedIn => _loggedIn;
set loggedIn(value) {
_loggedIn = value;
notifyListeners();
}
final AuthService authService;
ReflexRouterDelegate(this.authService)
: _navigatorKey = GlobalKey<NavigatorState>() {
_init();
}
_init() async {
try {
await authService.init();
bool isAuthenticated = await authService.isLoggedIn();
// If the access token check failed but we have a refresh token,
// try to silently renew before forcing the user back to the login screen.
if (!isAuthenticated &&
authService.refreshToken != null &&
authService.refreshToken!.isNotEmpty) {
try {
await authService.doRefreshToken();
authService.tokenRefresher = TokenRefresher(authService,
refreshInterval: const Duration(seconds: 60));
authService.tokenRefresher!.start();
isAuthenticated = await authService.isLoggedIn();
} catch (_) {
// Refresh token is expired or invalid — full re-login required.
}
}
loggedIn = isAuthenticated;
} catch (e) {
loggedIn = false;
}
}
@override
Widget build(BuildContext context) {
List<Page> 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<Page> get _splashStack => [const SplashPage()];
List<Page> get _loggedOutStack => [
LoginPage(onLogin: () {
loggedIn = true;
})
];
List<Page> get _loggedInStack {
return [
HomePage(onLogout: () {
loggedIn = false;
}),
];
}
@override
Future<void> setNewRoutePath(configuration) async {/* Do Nothing */}
}