85 lines
1.9 KiB
Dart
85 lines
1.9 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();
|
|
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<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 */}
|
|
}
|