beamer 0.13.1 beamer: ^0.13.1 copied to clipboard
A routing package that lets you navigate through guarded page stacks and URLs using the Router and Navigator's Pages API, aka "Navigator 2.0".
import 'package:flutter/material.dart';
import 'package:beamer/beamer.dart';
// DATA
const List<Map<String, String>> books = [
{
'id': '1',
'title': 'Stranger in a Strange Land',
'author': 'Robert A. Heinlein',
},
{
'id': '2',
'title': 'Foundation',
'author': 'Isaac Asimov',
},
{
'id': '3',
'title': 'Fahrenheit 451',
'author': 'Ray Bradbury',
},
];
// SCREENS
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () => context.beamToNamed('/books'),
child: Text('See books'),
),
),
);
}
}
class BooksScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Books'),
),
body: ListView(
children: books
.map(
(book) => ListTile(
title: Text(book['title']!),
subtitle: Text(book['author']!),
onTap: () => context.beamToNamed('/books/${book['id']}'),
),
)
.toList(),
),
);
}
}
class BookDetailsScreen extends StatelessWidget {
const BookDetailsScreen(this.bookDetails);
final Map<String, String> bookDetails;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(bookDetails['title']!),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Author: ${bookDetails['author']!}'),
),
);
}
}
// LOCATIONS
class BooksLocation extends BeamLocation {
BooksLocation(BeamState state) : super(state);
@override
List<String> get pathBlueprints => ['/books/:bookId'];
@override
List<BeamPage> buildPages(BuildContext context, BeamState state) => [
BeamPage(
key: ValueKey('home'),
child: HomeScreen(),
),
if (state.uri.pathSegments.contains('books'))
BeamPage(
key: ValueKey('books'),
child: BooksScreen(),
),
if (state.pathParameters.containsKey('bookId'))
BeamPage(
key: ValueKey('book-${state.pathParameters['bookId']}'),
child: BookDetailsScreen(
books.firstWhere(
(book) => book['id'] == state.pathParameters['bookId']!),
),
),
];
}
// APP
class MyApp extends StatelessWidget {
final routerDelegate = BeamerDelegate(
locationBuilder: (state) => BooksLocation(state),
);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
debugShowCheckedModeBanner: false,
routerDelegate: routerDelegate,
routeInformationParser: BeamerParser(),
backButtonDispatcher:
BeamerBackButtonDispatcher(delegate: routerDelegate),
);
}
}
void main() => runApp(MyApp());