mirror of https://github.com/flutter/samples.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.3 KiB
113 lines
3.3 KiB
// Copyright 2021, the Flutter project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'auth.dart';
|
|
import 'routing.dart';
|
|
import 'screens/navigator.dart';
|
|
|
|
class Bookstore extends StatefulWidget {
|
|
const Bookstore({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
_BookstoreState createState() => _BookstoreState();
|
|
}
|
|
|
|
class _BookstoreState extends State<Bookstore> {
|
|
final _auth = BookstoreAuth();
|
|
final _navigatorKey = GlobalKey<NavigatorState>();
|
|
late final RouteState _routeState;
|
|
late final SimpleRouterDelegate _routerDelegate;
|
|
late final TemplateRouteParser _routeParser;
|
|
|
|
@override
|
|
void initState() {
|
|
/// Configure the parser with all of the app's allowed path templates.
|
|
_routeParser = TemplateRouteParser(
|
|
allowedPaths: [
|
|
'/signin',
|
|
'/authors',
|
|
'/settings',
|
|
'/books/new',
|
|
'/books/all',
|
|
'/books/popular',
|
|
'/book/:bookId',
|
|
'/author/:authorId',
|
|
],
|
|
guard: _guard,
|
|
initialRoute: '/signin',
|
|
);
|
|
|
|
_routeState = RouteState(_routeParser);
|
|
|
|
_routerDelegate = SimpleRouterDelegate(
|
|
routeState: _routeState,
|
|
navigatorKey: _navigatorKey,
|
|
builder: (context) => BookstoreNavigator(
|
|
navigatorKey: _navigatorKey,
|
|
),
|
|
);
|
|
|
|
// Listen for when the user logs out and display the signin screen.
|
|
_auth.addListener(_handleAuthStateChanged);
|
|
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) => RouteStateScope(
|
|
notifier: _routeState,
|
|
child: BookstoreAuthScope(
|
|
notifier: _auth,
|
|
child: MaterialApp.router(
|
|
routerDelegate: _routerDelegate,
|
|
routeInformationParser: _routeParser,
|
|
// Revert back to pre-Flutter-2.5 transition behavior:
|
|
// https://github.com/flutter/flutter/issues/82053
|
|
theme: ThemeData(
|
|
pageTransitionsTheme: const PageTransitionsTheme(
|
|
builders: {
|
|
TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
|
|
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
|
|
TargetPlatform.linux: FadeUpwardsPageTransitionsBuilder(),
|
|
TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
|
|
TargetPlatform.windows: FadeUpwardsPageTransitionsBuilder(),
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
Future<ParsedRoute> _guard(ParsedRoute from) async {
|
|
final signedIn = _auth.signedIn;
|
|
final signInRoute = ParsedRoute('/signin', '/signin', {}, {});
|
|
|
|
// Go to /signin if the user is not signed in
|
|
if (!signedIn && from != signInRoute) {
|
|
return signInRoute;
|
|
}
|
|
// Go to /books if the user is signed in and tries to go to /signin.
|
|
else if (signedIn && from == signInRoute) {
|
|
return ParsedRoute('/books/popular', '/books/popular', {}, {});
|
|
}
|
|
return from;
|
|
}
|
|
|
|
void _handleAuthStateChanged() {
|
|
if (!_auth.signedIn) {
|
|
_routeState.go('/signin');
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_auth.removeListener(_handleAuthStateChanged);
|
|
_routeState.dispose();
|
|
_routerDelegate.dispose();
|
|
super.dispose();
|
|
}
|
|
}
|