├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── example ├── lib │ └── main.dart ├── pubspec.lock └── pubspec.yaml ├── lib └── flutter_router.dart ├── pubspec.lock └── pubspec.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .dart_tool/ 3 | 4 | .packages 5 | .pub/ 6 | 7 | build/ -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [1.2.0] - 10.10.2023 2 | 3 | * Added route settings to params 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Peter ZAGORANSKI 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter Router 2 | [![pub package](https://img.shields.io/pub/v/flutter_router.svg)](https://pub.dartlang.org/packages/flutter_router) 3 | 4 | Flutter routing library that adds flexible routing options like parameters and clear route definitions. 5 | 6 | ## Usage 7 | To use this plugin, add `flutter_router` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). 8 | 9 | ## Usage 10 | ``` dart 11 | // Import package 12 | import 'package:flutter_router/flutter_router.dart'; 13 | ``` 14 | 15 | ``` dart 16 | runApp(MaterialApp( 17 | onGenerateRoute: Router({ 18 | '/accounts/{id}': (context, match) => Account(id: match.parameters['id'), 19 | '/': (context, match) => Index(), 20 | }).get, 21 | )); 22 | ``` 23 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_router/flutter_router.dart' as FRouter; 4 | 5 | void main() => runApp(MaterialApp( 6 | onGenerateRoute: FRouter.Router({ 7 | '/accounts/{id}': (context, match, settings) => Account(match!.parameters['id']!), 8 | '/': (context, match, settings) => Index(), 9 | }).get, 10 | )); 11 | 12 | /*void main() => runApp(CupertinoApp( 13 | onGenerateRoute: CupertinoRouter({ 14 | '/accounts/{id}': (context, match) => Account(match.parameters['id']), 15 | '/': (context, match) => Index(), 16 | }).get, 17 | ));*/ 18 | 19 | class Account extends StatelessWidget { 20 | final String id; 21 | 22 | Account(this.id); 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Scaffold(body: Center(child: Text(this.id))); 27 | } 28 | } 29 | 30 | class Index extends StatelessWidget { 31 | @override 32 | Widget build(BuildContext context) { 33 | return Scaffold(body: Center(child: Text('Index'))); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /example/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.2" 44 | fake_async: 45 | dependency: transitive 46 | description: 47 | name: fake_async 48 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.1" 52 | flutter: 53 | dependency: "direct main" 54 | description: flutter 55 | source: sdk 56 | version: "0.0.0" 57 | flutter_router: 58 | dependency: "direct dev" 59 | description: 60 | path: ".." 61 | relative: true 62 | source: path 63 | version: "1.2.0" 64 | flutter_test: 65 | dependency: "direct dev" 66 | description: flutter 67 | source: sdk 68 | version: "0.0.0" 69 | matcher: 70 | dependency: transitive 71 | description: 72 | name: matcher 73 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" 74 | url: "https://pub.dev" 75 | source: hosted 76 | version: "0.12.16" 77 | material_color_utilities: 78 | dependency: transitive 79 | description: 80 | name: material_color_utilities 81 | sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" 82 | url: "https://pub.dev" 83 | source: hosted 84 | version: "0.5.0" 85 | meta: 86 | dependency: transitive 87 | description: 88 | name: meta 89 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 90 | url: "https://pub.dev" 91 | source: hosted 92 | version: "1.9.1" 93 | path: 94 | dependency: transitive 95 | description: 96 | name: path 97 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 98 | url: "https://pub.dev" 99 | source: hosted 100 | version: "1.8.3" 101 | quiver: 102 | dependency: transitive 103 | description: 104 | name: quiver 105 | sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 106 | url: "https://pub.dev" 107 | source: hosted 108 | version: "3.2.1" 109 | sky_engine: 110 | dependency: transitive 111 | description: flutter 112 | source: sdk 113 | version: "0.0.99" 114 | source_span: 115 | dependency: transitive 116 | description: 117 | name: source_span 118 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 119 | url: "https://pub.dev" 120 | source: hosted 121 | version: "1.10.0" 122 | stack_trace: 123 | dependency: transitive 124 | description: 125 | name: stack_trace 126 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 127 | url: "https://pub.dev" 128 | source: hosted 129 | version: "1.11.0" 130 | stream_channel: 131 | dependency: transitive 132 | description: 133 | name: stream_channel 134 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 135 | url: "https://pub.dev" 136 | source: hosted 137 | version: "2.1.1" 138 | string_scanner: 139 | dependency: transitive 140 | description: 141 | name: string_scanner 142 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 143 | url: "https://pub.dev" 144 | source: hosted 145 | version: "1.2.0" 146 | term_glyph: 147 | dependency: transitive 148 | description: 149 | name: term_glyph 150 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 151 | url: "https://pub.dev" 152 | source: hosted 153 | version: "1.2.1" 154 | test_api: 155 | dependency: transitive 156 | description: 157 | name: test_api 158 | sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" 159 | url: "https://pub.dev" 160 | source: hosted 161 | version: "0.6.0" 162 | uri: 163 | dependency: transitive 164 | description: 165 | name: uri 166 | sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" 167 | url: "https://pub.dev" 168 | source: hosted 169 | version: "1.0.0" 170 | vector_math: 171 | dependency: transitive 172 | description: 173 | name: vector_math 174 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 175 | url: "https://pub.dev" 176 | source: hosted 177 | version: "2.1.4" 178 | web: 179 | dependency: transitive 180 | description: 181 | name: web 182 | sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 183 | url: "https://pub.dev" 184 | source: hosted 185 | version: "0.1.4-beta" 186 | sdks: 187 | dart: ">=3.1.3 <4.0.0" 188 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_router_example 2 | description: Demonstrates how to use the flutter_router library. 3 | version: 1.0.7 4 | authors: 5 | - Peter Zagoranski 6 | homepage: https://github.com/peterzagoranski/flutter_router 7 | 8 | environment: 9 | sdk: '>=3.1.3 <4.0.0' 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | 15 | dev_dependencies: 16 | flutter_test: 17 | sdk: flutter 18 | 19 | flutter_router: 20 | path: ../ 21 | 22 | flutter: 23 | uses-material-design: true 24 | -------------------------------------------------------------------------------- /lib/flutter_router.dart: -------------------------------------------------------------------------------- 1 | library flutter_router; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:uri/uri.dart'; 6 | 7 | typedef Widget RouterBuilder(BuildContext context, UriMatch? match, RouteSettings settings); 8 | 9 | class Router extends _Router { 10 | Router(final Map definitions) : super(definitions, page: ((settings, builder) => new MaterialPageRoute(builder: builder, settings: settings))); 11 | } 12 | 13 | class CupertinoRouter extends _Router { 14 | CupertinoRouter(final Map definitions) : super(definitions, page: ((settings, builder) => new CupertinoPageRoute(settings: settings, builder: builder))); 15 | } 16 | 17 | abstract class _Router { 18 | 19 | _Router(final Map definitions, { required this.page }) : this.definitions = definitions; 20 | 21 | Route? get(final RouteSettings settings) { 22 | final matches = this.definitions.keys.where((route) => UriParser(UriTemplate(route)).matches(Uri.parse(settings.name!))); 23 | final route = matches.length > 0 ? matches.first : null; 24 | 25 | return null != route ? this.page(settings, (context)=> this.definitions[route]!(context, UriParser(UriTemplate(route)).match(Uri.parse(settings.name!)), settings)) : null; 26 | } 27 | 28 | final Map definitions; 29 | final PageRouteFactory page; 30 | } 31 | 32 | class Navigators extends _Navigators { 33 | Navigators(final List navigators) : super(navigators, page: ((settings, builder) => MaterialPageRoute(settings: settings, builder: builder))); 34 | } 35 | 36 | abstract class _Navigators { 37 | _Navigators(this.navigators, { this.page }) : assert( null != page); 38 | 39 | Route? get(final RouteSettings settings) { 40 | final matches = this.navigators.where((navigator) => navigator.initialRoute!.startsWith(settings.name!)); 41 | 42 | return matches.length > 0 ? this.page!(settings, (context) => matches.first) : null; 43 | } 44 | 45 | final List navigators; 46 | final PageRouteFactory? page; 47 | } -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.2" 44 | fake_async: 45 | dependency: transitive 46 | description: 47 | name: fake_async 48 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.1" 52 | flutter: 53 | dependency: "direct main" 54 | description: flutter 55 | source: sdk 56 | version: "0.0.0" 57 | flutter_test: 58 | dependency: "direct dev" 59 | description: flutter 60 | source: sdk 61 | version: "0.0.0" 62 | matcher: 63 | dependency: transitive 64 | description: 65 | name: matcher 66 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" 67 | url: "https://pub.dev" 68 | source: hosted 69 | version: "0.12.16" 70 | material_color_utilities: 71 | dependency: transitive 72 | description: 73 | name: material_color_utilities 74 | sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" 75 | url: "https://pub.dev" 76 | source: hosted 77 | version: "0.5.0" 78 | meta: 79 | dependency: transitive 80 | description: 81 | name: meta 82 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 83 | url: "https://pub.dev" 84 | source: hosted 85 | version: "1.9.1" 86 | path: 87 | dependency: transitive 88 | description: 89 | name: path 90 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 91 | url: "https://pub.dev" 92 | source: hosted 93 | version: "1.8.3" 94 | quiver: 95 | dependency: transitive 96 | description: 97 | name: quiver 98 | sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 99 | url: "https://pub.dev" 100 | source: hosted 101 | version: "3.2.1" 102 | sky_engine: 103 | dependency: transitive 104 | description: flutter 105 | source: sdk 106 | version: "0.0.99" 107 | source_span: 108 | dependency: transitive 109 | description: 110 | name: source_span 111 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 112 | url: "https://pub.dev" 113 | source: hosted 114 | version: "1.10.0" 115 | stack_trace: 116 | dependency: transitive 117 | description: 118 | name: stack_trace 119 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 120 | url: "https://pub.dev" 121 | source: hosted 122 | version: "1.11.0" 123 | stream_channel: 124 | dependency: transitive 125 | description: 126 | name: stream_channel 127 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 128 | url: "https://pub.dev" 129 | source: hosted 130 | version: "2.1.1" 131 | string_scanner: 132 | dependency: transitive 133 | description: 134 | name: string_scanner 135 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 136 | url: "https://pub.dev" 137 | source: hosted 138 | version: "1.2.0" 139 | term_glyph: 140 | dependency: transitive 141 | description: 142 | name: term_glyph 143 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "1.2.1" 147 | test_api: 148 | dependency: transitive 149 | description: 150 | name: test_api 151 | sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "0.6.0" 155 | uri: 156 | dependency: "direct main" 157 | description: 158 | name: uri 159 | sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "1.0.0" 163 | vector_math: 164 | dependency: transitive 165 | description: 166 | name: vector_math 167 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "2.1.4" 171 | web: 172 | dependency: transitive 173 | description: 174 | name: web 175 | sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "0.1.4-beta" 179 | sdks: 180 | dart: ">=3.1.3 <4.0.0" 181 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_router 2 | description: Flutter routing library that adds flexible routing options like parameters and clear route definitions 3 | version: 1.2.0 4 | homepage: https://github.com/peterzagoranski/flutter_router 5 | 6 | environment: 7 | sdk: '>=3.1.3 <4.0.0' 8 | 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | uri: ^1.0.0 14 | 15 | dev_dependencies: 16 | flutter_test: 17 | sdk: flutter 18 | 19 | flutter: 20 | --------------------------------------------------------------------------------