remove method

RouteMatchList remove(
  1. RouteMatch match
)

Returns a new instance of RouteMatchList with the input match removed from the current instance.

Implementation

RouteMatchList remove(RouteMatch match) {
  final List<RouteMatch> newMatches = matches.toList();
  final int index = newMatches.indexOf(match);
  assert(index != -1);
  newMatches.removeRange(index, newMatches.length);

  // Also pop ShellRoutes that have no subsequent route matches and GoRoutes
  // that only have redirect.
  while (newMatches.isNotEmpty &&
      (newMatches.last.route is ShellRouteBase ||
          (newMatches.last.route as GoRoute).redirectOnly)) {
    newMatches.removeLast();
  }
  // Removing ImperativeRouteMatch should not change uri and pathParameters.
  if (match is ImperativeRouteMatch) {
    return _copyWith(matches: newMatches);
  }

  final String fullPath = _generateFullPath(
      newMatches.where((RouteMatch match) => match is! ImperativeRouteMatch));
  // Need to remove path parameters that are no longer in the fullPath.
  final List<String> newParameters = <String>[];
  patternToRegExp(fullPath, newParameters);
  final Set<String> validParameters = newParameters.toSet();
  final Map<String, String> newPathParameters =
      Map<String, String>.fromEntries(
    pathParameters.entries.where((MapEntry<String, String> value) =>
        validParameters.contains(value.key)),
  );
  final Uri newUri =
      uri.replace(path: patternToPath(fullPath, newPathParameters));
  return _copyWith(
    matches: newMatches,
    uri: newUri,
    pathParameters: newPathParameters,
  );
}