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 1 : BetterRouter({required this.routes}); 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 = _matcher(path); 19 : 20 : final WidgetBuilder pageContentBuilder = 21 5 : routes[path] ?? routes[routeInfo.path]!; 22 : 23 1 : final Route<dynamic> route = pageRouteBuilder<dynamic>( 24 2 : settings.copyWith(arguments: routeInfo.data), 25 : pageContentBuilder, 26 : ); 27 : 28 : return route; 29 : } 30 : 31 1 : Iterable<Matcher> get _mapper => 32 7 : routes.keys.map((path) => Matcher(path, RegExp("^$path\$"))); 33 : 34 : final _mapped = <String, RouteInfo>{}; 35 : 36 3 : RouteInfo _matcher(path) => _mapped.putIfAbsent( 37 : path, 38 6 : () => _mapper.map((m) => m.matchWith(path)).lastWhere( 39 1 : (element) => element != null, 40 0 : orElse: () => RouteInfo(path: "/404", data: {}), 41 : )!); 42 : }