beamer 1.0.0-nullsafety.0 beamer: ^1.0.0-nullsafety.0 copied to clipboard
A router that lets you navigate through guarded page stacks and URLs using the Navigator 2.0 API effortlessly.
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.beamTo(BooksLocation(pathBlueprint: '/books')),
child: Text('Beam to books location'),
),
),
);
}
}
class BooksScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final titleQuery =
Beamer.of(context).currentLocation.queryParameters['title'] ?? '';
return Scaffold(
appBar: AppBar(
title: Text('Books'),
),
body: ListView(
children: books
.where((book) =>
book['title']!.toLowerCase().contains(titleQuery.toLowerCase()))
.map((book) => ListTile(
title: Text(book['title']!),
subtitle: Text(book['author']!),
onTap: () => Beamer.of(context).updateCurrentLocation(
pathBlueprint: '/books/:bookId',
pathParameters: {'bookId': book['id']!},
),
))
.toList(),
),
);
}
}
class BookDetailsScreen extends StatelessWidget {
BookDetailsScreen({
this.bookId = '',
}) : book = books.firstWhere((book) => book['id'] == bookId);
final String bookId;
final Map<String, String> book;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(book['title']!),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Author: ${book['author']}'),
),
);
}
}
// LOCATIONS
class HomeLocation extends BeamLocation {
@override
List<String> get pathBlueprints => ['/'];
@override
List<BeamPage> get pages => [
BeamPage(
key: ValueKey('home'),
child: HomeScreen(),
),
];
}
class BooksLocation extends BeamLocation {
BooksLocation({
String? pathBlueprint,
Map<String, String>? pathParameters,
}) : super(
pathBlueprint: pathBlueprint,
pathParameters: pathParameters,
);
@override
List<String> get pathBlueprints => ['/books/:bookId'];
@override
List<BeamPage> get pages => [
...HomeLocation().pages,
if (pathSegments.contains('books'))
BeamPage(
key: ValueKey('books-${queryParameters['title'] ?? ''}'),
child: BooksScreen(),
),
if (pathParameters.containsKey('bookId'))
BeamPage(
key: ValueKey('book-${pathParameters['bookId']}'),
child: BookDetailsScreen(
bookId: pathParameters['bookId']!,
),
),
];
}
// APP
class MyApp extends StatelessWidget {
final BeamLocation initialLocation = HomeLocation();
final List<BeamLocation> beamLocations = [
HomeLocation(),
BooksLocation(),
];
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerDelegate: BeamerRouterDelegate(
initialLocation: initialLocation,
),
routeInformationParser: BeamerRouteInformationParser(
beamLocations: beamLocations,
),
);
}
}
void main() {
runApp(MyApp());
}