class AuthGuard extends AutoRouteGuard {
@override
void onNavigation(NavigationResolver resolver, StackRouter router) {
final authenticated = myService().authenticated;
if (authenticated) {
resolver.next(true);
}
else {
resolver.redirect(const AuthRoute());
}
}
}
Единственная проблема — это необходимость использовать или глобальные переменные или каждый раз инициализировать сервисы для проверки каких-то данных.
Для этого
RouteGuard, можно пометить аннотацией @injectable из одноименной библиотеки, и можно туда передать уже существующий синглтон.
@injectable
class AuthGuard extends AutoRouteGuard {
final MySingleton singleton;
AuthGuard({required this.singleton});
@override
void onNavigation(NavigationResolver resolver, StackRouter router) {
final authenticated = singleton.isAuth;
…..,
}
}
Добавление же
AuthGuard в роут тоже достаточно просто:
AutoRoute(
page: HomeRoute.page,
guards: [
AuthGuard(),
],
),
Или в случае использования injectable/getIt:
GetIt.instance<AuthGuard>().
Route wrapper позволяет оборачивает роут. Используя аннотацию
AutoRouteWrapper.
@RoutePage()
class ProductsScreen extends StatelessWidget implements AutoRouteWrapper {
@override
Widget wrappedRoute(BuildContext context) {
return Provider(create: (ctx) => ProductsBloc(), child: this);
}
...
}
Самое интересное то, что дочерний Route не только будет иметь доступ к блоку, но и может быть обернут, например, в Scaffold с AppBar.
На этом наша серия постов о библиотеке auto_route подошла к концу. Делитесь в комментариях, было ли полезно?
