You've already forked flutter-rp-example
96 lines
2.5 KiB
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 */}
|
|
}
|