https://github.com/aloisdeniel/route_pattern_generator
A Dart static code generator that produces matchers and builders from route uri patterns.
https://github.com/aloisdeniel/route_pattern_generator
dart flutter match pattern routing uri
Last synced: about 2 months ago
JSON representation
A Dart static code generator that produces matchers and builders from route uri patterns.
- Host: GitHub
- URL: https://github.com/aloisdeniel/route_pattern_generator
- Owner: aloisdeniel
- Created: 2019-05-17T14:10:44.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2021-05-06T18:05:39.000Z (about 4 years ago)
- Last Synced: 2024-10-12T22:43:20.046Z (7 months ago)
- Topics: dart, flutter, match, pattern, routing, uri
- Language: Dart
- Size: 35.2 KB
- Stars: 33
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# route_pattern_generator
A Dart static code generator that produces matchers and builders from route URI patterns.
## Quickstart
Define your patterns as constant strings annoted with `@route`.
```dart
import 'package:route_pattern/route_pattern.dart';
import 'package:flutter/widgets.dart';part 'routes.g.dart';
@RoutePattern("/?tab&[int]scroll")
Route home(RouteSettings settings, HomeRouteArguments arguments) {
// returns a Route
}@RoutePattern("/article/:[int]id")
Route article(RouteSettings settings, ArticleRouteArguments arguments) {
// returns a Route
}
```Each constant will generate a `Route` with a `build` and `match` method, and a associated `Argument` class ([an example of the generate sources is available in the sample](sample/lib/routes.g.dart)).
```dart
// Build specific routes
final path = Routes.home.build(HomeRouteArguments(tab: "users"));
expect(path, "/?tab=users");final path = Routes.article.build(ArticleRouteArguments(id: "12345"));
expect(path, "/article/12345");// Match specific routes
final match = Routes.home.match("/?tab=users");
expect(match.isSuccess, true);
expect(match.arguments.tab, 'users');final match = Routes.article.match("/article/12345");
expect(match.isSuccess, true);
expect(match.arguments.id, '12345');// Or get the first matching route
final match = Routes.match("/article/12345");
if(match is MatchResult) {
expect(match.arguments.id, '12345');
}
```A `Routes.onGenerateRoute` method is also generated to use in your app or navigator. It will match the first route which settings name matches a pattern and call your declared function with corresponding arguments.
```dart
import 'package:sample/routes.dart';
import 'package:flutter/material.dart';class ExampleApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
onGenerateRoute: Routes.onGenerateRoute,
// ...
);
}
}
```To navigate to a given route, a `Routes.push` method is also available :
```dart
await Routes.push(context, ArticleRouteArguments(id: '12345'));
```## How to use
### Install
There are a few separate packages you need to install:
```yaml
dependencies:
route_pattern:dev_dependencies:
route_pattern_generator:
build_runner:
```### Pattern format
A route pattern is composed of static segments separated with `/`, **required** parameters as dynamic segments (starting with `:`), and **optional** parameters as query parameters (starting with `?` and separated by `&`).
### Typing parameters
By default, arguments are of type `String`, but a custom type surrounded with `[` and `]` can be added at the beginning of a required or optional parameter. This type must have static `T parse(String value)` and `String toString()` methods to serialize and deserialize arguments from path.
#### Example
`/article/:[int]id/details?tab&[int]scroll`
* `article` : static segment
* `id` : required dynamic segment of type `int`
* `details` : static segment
* `tab` : optionnal query parameter of type `String`
* `scroll` : optionnal query parameter of type `int`This example will match those URIs :
* `/article/26436/details`
* `/article/1234/details?tab=second`
* `/article/98904/details?tab=first&scroll=8`### Run the generator
To run the generator, you must use `build_runner` cli:
```sh
flutter pub pub run build_runner watch
```