diff --git a/navigation_and_routing/old_snippets/navigator/anonymous_routes.dart b/navigation_and_routing/old_snippets/navigator/anonymous_routes.dart deleted file mode 100644 index bfd00cfa7..000000000 --- a/navigation_and_routing/old_snippets/navigator/anonymous_routes.dart +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2020, 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. - -/// Shows how to use [Navigator] APIs to push and pop an anonymous -/// route. In this case, it is an instance of [MaterialPageRoute]. -library anonymous_routes; - -import 'package:flutter/material.dart'; - -void main() { - runApp(const Nav2App()); -} - -class Nav2App extends StatelessWidget { - const Nav2App({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const MaterialApp( - home: HomeScreen(), - ); - } -} - -class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: TextButton( - child: const Text('View Details'), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const DetailScreen(); - }), - ); - }, - ), - ), - ); - } -} - -class DetailScreen extends StatelessWidget { - const DetailScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: TextButton( - child: const Text('Pop!'), - onPressed: () { - Navigator.pop(context); - }, - ), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/navigator/named_routes.dart b/navigation_and_routing/old_snippets/navigator/named_routes.dart deleted file mode 100644 index 58ebc2b4e..000000000 --- a/navigation_and_routing/old_snippets/navigator/named_routes.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2020, 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. - -/// Shows how to use define named routes via the `routes` parameter on -/// MaterialApp, and navigate using Navigator.pushNamed. -library named_routes; - -import 'package:flutter/material.dart'; - -void main() { - runApp(const Nav2App()); -} - -class Nav2App extends StatelessWidget { - const Nav2App({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialApp( - routes: { - '/': (context) => const HomeScreen(), - '/details': (context) => const DetailScreen(), - }, - ); - } -} - -class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: TextButton( - child: const Text('View Details'), - onPressed: () { - Navigator.pushNamed( - context, - '/details', - ); - }, - ), - ), - ); - } -} - -class DetailScreen extends StatelessWidget { - const DetailScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: TextButton( - child: const Text('Pop!'), - onPressed: () { - Navigator.pop(context); - }, - ), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/navigator/on_generate_route.dart b/navigation_and_routing/old_snippets/navigator/on_generate_route.dart deleted file mode 100644 index 467a59ae0..000000000 --- a/navigation_and_routing/old_snippets/navigator/on_generate_route.dart +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2020, 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. - -/// Shows how to handle arbitrary named routes using the `onGenerateRoute` -/// callback defined in the `MaterialApp` constructor. -library on_generate_route; - -import 'package:flutter/material.dart'; - -void main() { - runApp(const Nav2App()); -} - -class Nav2App extends StatelessWidget { - const Nav2App({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return MaterialApp( - onGenerateRoute: (settings) { - // Handle '/' - if (settings.name == '/') { - return MaterialPageRoute( - builder: (context) => const HomeScreen()); - } - - // Handle '/details/:id' - var uri = Uri.parse(settings.name ?? ''); - if (uri.pathSegments.length == 2 && - uri.pathSegments.first == 'details') { - var id = uri.pathSegments[1]; - return MaterialPageRoute( - builder: (context) => DetailScreen(id: id)); - } - - return MaterialPageRoute( - builder: (context) => const UnknownScreen()); - }, - ); - } -} - -class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: TextButton( - child: const Text('View Details'), - onPressed: () { - Navigator.pushNamed( - context, - '/details/1', - ); - }, - ), - ), - ); - } -} - -class DetailScreen extends StatelessWidget { - final String id; - - const DetailScreen({ - required this.id, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Viewing details for item $id'), - TextButton( - child: const Text('Pop!'), - onPressed: () { - Navigator.pop(context); - }, - ), - ], - ), - ), - ); - } -} - -class UnknownScreen extends StatelessWidget { - const UnknownScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: const Center( - child: Text('404!'), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/router/pages.dart b/navigation_and_routing/old_snippets/router/pages.dart deleted file mode 100644 index fae931907..000000000 --- a/navigation_and_routing/old_snippets/router/pages.dart +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2020, 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. - -/// Shows how to define a list of [Page] objects on Navigator declaratively. -library nav2_pages; - -import 'package:flutter/material.dart'; - -void main() { - runApp(const BooksApp()); -} - -class Book { - final String title; - final String author; - - Book(this.title, this.author); -} - -class BooksApp extends StatefulWidget { - const BooksApp({Key? key}) : super(key: key); - - @override - State createState() => _BooksAppState(); -} - -class _BooksAppState extends State { - Book? _selectedBook; - - final List books = [ - Book('Left Hand of Darkness', 'Ursula K. Le Guin'), - Book('Too Like the Lightning', 'Ada Palmer'), - Book('Kindred', 'Octavia E. Butler'), - ]; - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Books App', - home: Navigator( - pages: [ - MaterialPage( - key: const ValueKey('BooksListPage'), - child: BooksListScreen( - books: books, - onTapped: _handleBookTapped, - ), - ), - if (_selectedBook != null) BookDetailsPage(book: _selectedBook) - ], - onPopPage: (route, dynamic result) { - if (!route.didPop(result)) { - return false; - } - - // Update the list of pages by setting _selectedBook to null - setState(() { - _selectedBook = null; - }); - - return true; - }, - ), - ); - } - - void _handleBookTapped(Book book) { - setState(() { - _selectedBook = book; - }); - } -} - -class BookDetailsPage extends Page { - final Book? book; - - BookDetailsPage({ - this.book, - }) : super(key: ValueKey(book)); - - @override - Route createRoute(BuildContext context) { - return MaterialPageRoute( - settings: this, - builder: (context) { - return BookDetailsScreen(book: book); - }, - ); - } -} - -class BooksListScreen extends StatelessWidget { - final List books; - final ValueChanged onTapped; - - const BooksListScreen({ - required this.books, - required this.onTapped, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: ListView( - children: [ - for (var book in books) - ListTile( - title: Text(book.title), - subtitle: Text(book.author), - onTap: () => onTapped(book), - ) - ], - ), - ); - } -} - -class BookDetailsScreen extends StatelessWidget { - final Book? book; - - const BookDetailsScreen({ - @required this.book, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (book != null) ...[ - Text(book!.title, style: Theme.of(context).textTheme.headline6), - Text(book!.author, style: Theme.of(context).textTheme.subtitle1), - ], - ], - ), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/router/router.dart b/navigation_and_routing/old_snippets/router/router.dart deleted file mode 100644 index bdceb73fe..000000000 --- a/navigation_and_routing/old_snippets/router/router.dart +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2020, 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. - -/// Full sample that shows a custom RouteInformationParser and RouterDelegate -/// parsing named routes and declaratively building the stack of pages for the -/// [Navigator]. -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -void main() { - runApp(const BooksApp()); -} - -class Book { - final String title; - final String author; - - Book(this.title, this.author); -} - -class BooksApp extends StatefulWidget { - const BooksApp({Key? key}) : super(key: key); - - @override - State createState() => _BooksAppState(); -} - -class _BooksAppState extends State { - final BookRouterDelegate _routerDelegate = BookRouterDelegate(); - final BookRouteInformationParser _routeInformationParser = - BookRouteInformationParser(); - - @override - Widget build(BuildContext context) { - return MaterialApp.router( - title: 'Books App', - routerDelegate: _routerDelegate, - routeInformationParser: _routeInformationParser, - ); - } -} - -class BookRouteInformationParser extends RouteInformationParser { - @override - Future parseRouteInformation( - RouteInformation routeInformation, - ) { - final uri = Uri.parse(routeInformation.location ?? ''); - // Handle '/' - if (uri.pathSegments.isEmpty) { - return SynchronousFuture(BookRoutePath.home()); - } - - // Handle '/book/:id' - if (uri.pathSegments.length == 2 && uri.pathSegments[0] == 'book') { - var remaining = uri.pathSegments[1]; - var id = int.tryParse(remaining); - if (id != null) { - return SynchronousFuture(BookRoutePath.details(id)); - } - } - - // Handle unknown routes - return SynchronousFuture(BookRoutePath.unknown()); - } - - @override - RouteInformation? restoreRouteInformation(BookRoutePath configuration) { - if (configuration.isUnknown) { - return const RouteInformation(location: '/404'); - } - if (configuration.isHomePage) { - return const RouteInformation(location: '/'); - } - if (configuration.isDetailsPage) { - return RouteInformation(location: '/book/${configuration.id}'); - } - return null; - } -} - -class BookRouterDelegate extends RouterDelegate - with ChangeNotifier, PopNavigatorRouterDelegateMixin { - @override - final GlobalKey navigatorKey; - - Book? _selectedBook; - bool show404 = false; - - final List books = [ - Book('Left Hand of Darkness', 'Ursula K. Le Guin'), - Book('Too Like the Lightning', 'Ada Palmer'), - Book('Kindred', 'Octavia E. Butler'), - ]; - - BookRouterDelegate() : navigatorKey = GlobalKey(); - - @override - BookRoutePath get currentConfiguration { - if (show404) { - return BookRoutePath.unknown(); - } - return _selectedBook == null - ? BookRoutePath.home() - : BookRoutePath.details(books.indexOf(_selectedBook!)); - } - - @override - Widget build(BuildContext context) { - return Navigator( - key: navigatorKey, - pages: [ - MaterialPage( - key: const ValueKey('BooksListPage'), - child: BooksListScreen( - books: books, - onTapped: _handleBookTapped, - ), - ), - if (show404) - const MaterialPage( - key: ValueKey('UnknownPage'), - child: UnknownScreen(), - ) - else if (_selectedBook != null) - BookDetailsPage(book: _selectedBook!) - ], - onPopPage: (route, dynamic result) { - if (!route.didPop(result)) { - return false; - } - - // Update the list of pages by setting _selectedBook to null - _selectedBook = null; - show404 = false; - notifyListeners(); - - return true; - }, - ); - } - - @override - Future setNewRoutePath(BookRoutePath configuration) { - if (configuration.isUnknown) { - _selectedBook = null; - show404 = true; - return SynchronousFuture(null); - } - - if (configuration.isDetailsPage) { - if (configuration.id! < 0 || configuration.id! > books.length - 1) { - show404 = true; - return SynchronousFuture(null); - } - - _selectedBook = books[configuration.id!]; - } else { - _selectedBook = null; - } - - show404 = false; - return SynchronousFuture(null); - } - - void _handleBookTapped(Book book) { - _selectedBook = book; - notifyListeners(); - } -} - -class BookDetailsPage extends Page { - final Book book; - - BookDetailsPage({ - required this.book, - }) : super(key: ValueKey(book)); - - @override - Route createRoute(BuildContext context) { - return MaterialPageRoute( - settings: this, - builder: (context) { - return BookDetailsScreen(book: book); - }, - ); - } -} - -class BookRoutePath { - final int? id; - final bool isUnknown; - - BookRoutePath.home() - : id = null, - isUnknown = false; - - BookRoutePath.details(this.id) : isUnknown = false; - - BookRoutePath.unknown() - : id = null, - isUnknown = true; - - bool get isHomePage => id == null; - - bool get isDetailsPage => id != null; -} - -class BooksListScreen extends StatelessWidget { - final List books; - final ValueChanged onTapped; - - const BooksListScreen({ - required this.books, - required this.onTapped, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: ListView( - children: [ - for (var book in books) - ListTile( - title: Text(book.title), - subtitle: Text(book.author), - onTap: () => onTapped(book), - ) - ], - ), - ); - } -} - -class BookDetailsScreen extends StatelessWidget { - final Book book; - - const BookDetailsScreen({ - required this.book, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(book.title, style: Theme.of(context).textTheme.headline6), - Text(book.author, style: Theme.of(context).textTheme.subtitle1), - ], - ), - ), - ); - } -} - -class UnknownScreen extends StatelessWidget { - const UnknownScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: const Center( - child: Text('404!'), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/router_advanced/nested_router.dart b/navigation_and_routing/old_snippets/router_advanced/nested_router.dart deleted file mode 100644 index 117b3f45a..000000000 --- a/navigation_and_routing/old_snippets/router_advanced/nested_router.dart +++ /dev/null @@ -1,426 +0,0 @@ -// Copyright 2020, 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. - -/// Shows two [RouterDelegate], one nested within the other. A -/// [BottomNavigationBar] can be used to select the route of the outer -/// RouterDelegate, and additional routes can be pushed onto the inner -/// RouterDelegate / Navigator. -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -void main() { - runApp(const NestedRouterDemo()); -} - -class Book { - final String title; - final String author; - - Book(this.title, this.author); -} - -class NestedRouterDemo extends StatefulWidget { - const NestedRouterDemo({Key? key}) : super(key: key); - - @override - _NestedRouterDemoState createState() => _NestedRouterDemoState(); -} - -class _NestedRouterDemoState extends State { - final BookRouterDelegate _routerDelegate = BookRouterDelegate(); - final BookRouteInformationParser _routeInformationParser = - BookRouteInformationParser(); - - @override - Widget build(BuildContext context) { - return MaterialApp.router( - title: 'Books App', - routerDelegate: _routerDelegate, - routeInformationParser: _routeInformationParser, - ); - } -} - -class BooksAppState extends ChangeNotifier { - int _selectedIndex; - - Book? _selectedBook; - - final List books = [ - Book('Left Hand of Darkness', 'Ursula K. Le Guin'), - Book('Too Like the Lightning', 'Ada Palmer'), - Book('Kindred', 'Octavia E. Butler'), - ]; - - BooksAppState() : _selectedIndex = 0; - - int get selectedIndex => _selectedIndex; - - set selectedIndex(int idx) { - _selectedIndex = idx; - if (_selectedIndex == 1) { - // Remove this line if you want to keep the selected book when navigating - // between "settings" and "home" which book was selected when Settings is - // tapped. - selectedBook = null; - } - notifyListeners(); - } - - Book? get selectedBook => _selectedBook; - - set selectedBook(Book? book) { - _selectedBook = book; - notifyListeners(); - } - - int getSelectedBookById() { - if (_selectedBook == null) return 0; - if (!books.contains(_selectedBook)) return 0; - return books.indexOf(_selectedBook!); - } - - void setSelectedBookById(int id) { - if (id < 0 || id > books.length - 1) { - return; - } - - _selectedBook = books[id]; - notifyListeners(); - } -} - -class BookRouteInformationParser extends RouteInformationParser { - @override - Future parseRouteInformation( - RouteInformation routeInformation, - ) { - final uri = Uri.parse(routeInformation.location ?? ''); - - if (uri.pathSegments.isNotEmpty && uri.pathSegments.first == 'settings') { - return SynchronousFuture(BooksSettingsPath()); - } else { - if (uri.pathSegments.length >= 2 && uri.pathSegments[0] == 'book') { - return SynchronousFuture( - BooksDetailsPath(int.tryParse(uri.pathSegments[1])!), - ); - } - return SynchronousFuture(BooksListPath()); - } - } - - @override - RouteInformation? restoreRouteInformation(BookRoutePath configuration) { - if (configuration is BooksListPath) { - return const RouteInformation(location: '/home'); - } - if (configuration is BooksSettingsPath) { - return const RouteInformation(location: '/settings'); - } - if (configuration is BooksDetailsPath) { - return RouteInformation(location: '/book/${configuration.id}'); - } - return null; - } -} - -class BookRouterDelegate extends RouterDelegate - with ChangeNotifier, PopNavigatorRouterDelegateMixin { - @override - final GlobalKey navigatorKey; - - BooksAppState appState = BooksAppState(); - - BookRouterDelegate() : navigatorKey = GlobalKey() { - appState.addListener(notifyListeners); - } - - @override - BookRoutePath get currentConfiguration { - if (appState.selectedIndex == 1) { - return BooksSettingsPath(); - } else { - if (appState.selectedBook == null) { - return BooksListPath(); - } else { - return BooksDetailsPath(appState.getSelectedBookById()); - } - } - } - - @override - Widget build(BuildContext context) { - return Navigator( - key: navigatorKey, - pages: [ - MaterialPage( - child: AppShell(appState: appState), - ), - ], - onPopPage: (route, dynamic result) { - if (!route.didPop(result)) { - return false; - } - - if (appState.selectedBook != null) { - appState.selectedBook = null; - } - notifyListeners(); - return true; - }, - ); - } - - @override - Future setNewRoutePath(BookRoutePath configuration) { - if (configuration is BooksListPath) { - appState.selectedIndex = 0; - appState.selectedBook = null; - } else if (configuration is BooksSettingsPath) { - appState.selectedIndex = 1; - } else if (configuration is BooksDetailsPath) { - appState.setSelectedBookById(configuration.id); - } - return SynchronousFuture(null); - } -} - -// Routes -abstract class BookRoutePath {} - -class BooksListPath extends BookRoutePath {} - -class BooksSettingsPath extends BookRoutePath {} - -class BooksDetailsPath extends BookRoutePath { - final int id; - - BooksDetailsPath(this.id); -} - -// Widget that contains the AdaptiveNavigationScaffold -class AppShell extends StatefulWidget { - final BooksAppState appState; - - const AppShell({ - required this.appState, - Key? key, - }) : super(key: key); - - @override - _AppShellState createState() => _AppShellState(); -} - -class _AppShellState extends State { - late final InnerRouterDelegate _routerDelegate; - late final ChildBackButtonDispatcher _backButtonDispatcher; - - @override - void initState() { - super.initState(); - _routerDelegate = InnerRouterDelegate(widget.appState); - } - - @override - void didUpdateWidget(covariant AppShell oldWidget) { - super.didUpdateWidget(oldWidget); - _routerDelegate.appState = widget.appState; - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - // Defer back button dispatching to the child router - _backButtonDispatcher = Router.of(context) - .backButtonDispatcher! - .createChildBackButtonDispatcher(); - } - - @override - Widget build(BuildContext context) { - var appState = widget.appState; - - // Claim priority, If there are parallel sub router, you will need - // to pick which one should take priority; - _backButtonDispatcher.takePriority(); - - return Scaffold( - appBar: AppBar(), - body: Router( - routerDelegate: _routerDelegate, - backButtonDispatcher: _backButtonDispatcher, - ), - bottomNavigationBar: BottomNavigationBar( - items: const [ - BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), - BottomNavigationBarItem( - icon: Icon(Icons.settings), label: 'Settings'), - ], - currentIndex: appState.selectedIndex, - onTap: (newIndex) { - appState.selectedIndex = newIndex; - }, - ), - ); - } -} - -class InnerRouterDelegate extends RouterDelegate - with ChangeNotifier, PopNavigatorRouterDelegateMixin { - @override - final GlobalKey navigatorKey = GlobalKey(); - - BooksAppState get appState => _appState; - BooksAppState _appState; - - set appState(BooksAppState value) { - if (value == _appState) { - return; - } - _appState = value; - notifyListeners(); - } - - InnerRouterDelegate(this._appState); - - @override - Widget build(BuildContext context) { - return Navigator( - key: navigatorKey, - pages: [ - if (appState.selectedIndex == 0) ...[ - FadeAnimationPage( - child: BooksListScreen( - books: appState.books, - onTapped: _handleBookTapped, - ), - key: const ValueKey('BooksListPage'), - ), - if (appState.selectedBook != null) - MaterialPage( - key: ValueKey(appState.selectedBook), - child: BookDetailsScreen(book: appState.selectedBook!), - ), - ] else - const FadeAnimationPage( - child: SettingsScreen(), - key: ValueKey('SettingsPage'), - ), - ], - onPopPage: (route, dynamic result) { - appState.selectedBook = null; - notifyListeners(); - return route.didPop(result); - }, - ); - } - - @override - Future setNewRoutePath(BookRoutePath configuration) { - // This is not required for inner router delegate because it does not - // parse route - assert(false); - return SynchronousFuture(null); - } - - void _handleBookTapped(Book book) { - appState.selectedBook = book; - notifyListeners(); - } -} - -class FadeAnimationPage extends Page { - final Widget child; - - const FadeAnimationPage({LocalKey? key, required this.child}) - : super(key: key); - - @override - Route createRoute(BuildContext context) { - return PageRouteBuilder( - settings: this, - pageBuilder: (context, animation, animation2) { - var curveTween = CurveTween(curve: Curves.easeIn); - return FadeTransition( - opacity: animation.drive(curveTween), - child: child, - ); - }, - ); - } -} - -// Screens -class BooksListScreen extends StatelessWidget { - final List books; - final ValueChanged onTapped; - - const BooksListScreen({ - required this.books, - required this.onTapped, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: ListView( - children: [ - for (var book in books) - ListTile( - title: Text(book.title), - subtitle: Text(book.author), - onTap: () => onTapped(book), - ) - ], - ), - ); - } -} - -class BookDetailsScreen extends StatelessWidget { - final Book book; - - const BookDetailsScreen({ - required this.book, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('Back'), - ), - ...[ - Text(book.title, style: Theme.of(context).textTheme.headline6), - Text(book.author, style: Theme.of(context).textTheme.subtitle1), - ], - ], - ), - ), - ); - } -} - -class SettingsScreen extends StatelessWidget { - const SettingsScreen({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Scaffold( - body: Center( - child: Text('Settings screen'), - ), - ); - } -} diff --git a/navigation_and_routing/old_snippets/router_advanced/transition_delegate.dart b/navigation_and_routing/old_snippets/router_advanced/transition_delegate.dart deleted file mode 100644 index c161f48f9..000000000 --- a/navigation_and_routing/old_snippets/router_advanced/transition_delegate.dart +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright 2020, 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. - -/// Shows how a custom TransitionDelegate can be used to customized when -/// transition animations are shown. (For example, -/// [when two routes are popped off the stack](https://github.com/flutter/flutter/issues/12146), -/// however the default TransitionDelegate will handle this if you are using -/// `Router`.) -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -void main() { - runApp(const BooksApp()); -} - -class Book { - final String title; - final String author; - - Book(this.title, this.author); -} - -class BooksApp extends StatefulWidget { - const BooksApp({Key? key}) : super(key: key); - - @override - State createState() => _BooksAppState(); -} - -class _BooksAppState extends State { - final BookRouterDelegate _routerDelegate = BookRouterDelegate(); - final BookRouteInformationParser _routeInformationParser = - BookRouteInformationParser(); - - @override - Widget build(BuildContext context) { - return MaterialApp.router( - title: 'Books App', - routerDelegate: _routerDelegate, - routeInformationParser: _routeInformationParser, - ); - } -} - -class BookRouteInformationParser extends RouteInformationParser { - @override - Future parseRouteInformation( - RouteInformation routeInformation, - ) { - final uri = Uri.parse(routeInformation.location ?? ''); - - if (uri.pathSegments.length >= 2) { - var remaining = uri.pathSegments[1]; - return SynchronousFuture(BookRoutePath.details(int.tryParse(remaining)!)); - } else { - return SynchronousFuture(BookRoutePath.home()); - } - } - - @override - RouteInformation? restoreRouteInformation(BookRoutePath configuration) { - if (configuration.isHomePage) { - return const RouteInformation(location: '/'); - } - if (configuration.isDetailsPage) { - return RouteInformation(location: '/book/${configuration.id}'); - } - return null; - } -} - -class BookRouterDelegate extends RouterDelegate - with ChangeNotifier, PopNavigatorRouterDelegateMixin { - @override - final GlobalKey navigatorKey; - - Book? _selectedBook; - - final List books = [ - Book('Left Hand of Darkness', 'Ursula K. Le Guin'), - Book('Too Like the Lightning', 'Ada Palmer'), - Book('Kindred', 'Octavia E. Butler'), - ]; - - BookRouterDelegate() : navigatorKey = GlobalKey(); - - @override - BookRoutePath get currentConfiguration => _selectedBook == null - ? BookRoutePath.home() - : BookRoutePath.details(books.indexOf(_selectedBook!)); - - @override - Widget build(BuildContext context) { - return Navigator( - key: navigatorKey, - transitionDelegate: NoAnimationTransitionDelegate(), - pages: [ - MaterialPage( - key: const ValueKey('BooksListPage'), - child: BooksListScreen( - books: books, - onTapped: _handleBookTapped, - ), - ), - if (_selectedBook != null) BookDetailsPage(book: _selectedBook!) - ], - onPopPage: (route, dynamic result) { - if (!route.didPop(result)) { - return false; - } - - // Update the list of pages by setting _selectedBook to null - _selectedBook = null; - notifyListeners(); - - return true; - }, - ); - } - - @override - Future setNewRoutePath(BookRoutePath configuration) { - if (configuration.isDetailsPage) { - _selectedBook = books[configuration.id!]; - } - return SynchronousFuture(null); - } - - void _handleBookTapped(Book book) { - _selectedBook = book; - notifyListeners(); - } -} - -class BookDetailsPage extends Page { - final Book book; - - BookDetailsPage({ - required this.book, - }) : super(key: ValueKey(book)); - - @override - Route createRoute(BuildContext context) { - return MaterialPageRoute( - settings: this, - builder: (context) { - return BookDetailsScreen(book: book); - }, - ); - } -} - -class BookRoutePath { - final int? id; - - BookRoutePath.home() : id = null; - - BookRoutePath.details(this.id); - - bool get isHomePage => id == null; - - bool get isDetailsPage => id != null; -} - -class BooksListScreen extends StatelessWidget { - final List books; - final ValueChanged onTapped; - - const BooksListScreen({ - required this.books, - required this.onTapped, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: ListView( - children: [ - for (var book in books) - ListTile( - title: Text(book.title), - subtitle: Text(book.author), - onTap: () => onTapped(book), - ) - ], - ), - ); - } -} - -class BookDetailsScreen extends StatelessWidget { - final Book book; - - const BookDetailsScreen({ - required this.book, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(book.title, style: Theme.of(context).textTheme.headline6), - Text(book.author, style: Theme.of(context).textTheme.subtitle1), - ], - ), - ), - ); - } -} - -class NoAnimationTransitionDelegate extends TransitionDelegate { - @override - Iterable resolve({ - required List newPageRouteHistory, - required Map - locationToExitingPageRoute, - required Map> - pageRouteToPagelessRoutes, - }) { - final results = []; - - for (final pageRoute in newPageRouteHistory) { - if (pageRoute.isWaitingForEnteringDecision) { - pageRoute.markForAdd(); - } - results.add(pageRoute); - } - - for (final exitingPageRoute in locationToExitingPageRoute.values) { - if (exitingPageRoute.isWaitingForExitingDecision) { - exitingPageRoute.markForRemove(); - final pagelessRoutes = pageRouteToPagelessRoutes[exitingPageRoute]; - if (pagelessRoutes != null) { - for (final pagelessRoute in pagelessRoutes) { - pagelessRoute.markForRemove(); - } - } - } - - results.add(exitingPageRoute); - } - return results; - } -}