Line data Source code
1 : import 'package:flutter/material.dart'; 2 : 3 : import 'route_info.dart'; 4 : import 'matcher.dart'; 5 : 6 : class BetterRouter { 7 : final Map<String, WidgetBuilder> routes; 8 : 9 3 : BetterRouter({required this.routes}) : assert(routes['-matchAll'] != null); 10 : 11 1 : pageRouteBuilder<T>(RouteSettings settings, WidgetBuilder builder) { 12 1 : return MaterialPageRoute<T>(settings: settings, builder: builder); 13 : } 14 : 15 1 : Route<dynamic>? call(RouteSettings settings) { 16 1 : final String path = settings.name!; 17 : 18 1 : RouteInfo routeInfo = _routeInfo(path); 19 : 20 3 : final WidgetBuilder pageContentBuilder = routes[routeInfo.path]!; 21 : 22 1 : final Route<dynamic> route = pageRouteBuilder<dynamic>( 23 2 : settings.copyWith(arguments: routeInfo.data), 24 : pageContentBuilder, 25 : ); 26 : 27 : return route; 28 : } 29 : 30 1 : Iterable<Matcher> get _mapper => 31 7 : routes.keys.map((path) => Matcher(path, RegExp("^$path\$"))); 32 : 33 : final _mapped = <String, RouteInfo>{}; 34 : 35 3 : RouteInfo _routeInfo(path) => _mapped.putIfAbsent( 36 : path, 37 6 : () => _mapper.map((m) => m.matchWith(path)).lastWhere( 38 1 : (element) => element != null, 39 3 : orElse: () => RouteInfo(path: "-matchAll", data: {}), 40 : )!); 41 : }