resolveRoutePath function

String resolveRoutePath(
  1. String page, {
  2. Map<String, String>? pathParams,
  3. Map<String, String>? queryParams,
})

Builds a concrete URL from a route template (1.5.0).

  • pathParams values replace :param segments. Pattern (:id(\d+)), optional (:id?) and wildcard (:path*) markers are stripped from the parameter name before lookup. Values are encoded per-segment (a literal / inside a value becomes %2F).
  • queryParams are merged into the query string, preserving any query already present in page.

Unresolved :param segments are left as-is (the route will simply not match, preserving the classic unknownRoute flow).

Implementation

String resolveRoutePath(
  String page, {
  Map<String, String>? pathParams,
  Map<String, String>? queryParams,
}) {
  var resolved = page;

  if (pathParams != null && pathParams.isNotEmpty) {
    // Textual path surgery: the query string (if any) is preserved
    // verbatim and values are encoded per-segment.
    final qIdx = resolved.indexOf('?');
    final query = qIdx >= 0 ? resolved.substring(qIdx) : '';
    final pathOnly = qIdx >= 0 ? resolved.substring(0, qIdx) : resolved;
    final segments = pathOnly.split('/');
    for (var i = 0; i < segments.length; i++) {
      if (segments[i].startsWith(':')) {
        segments[i] = _substituteSegment(segments[i], pathParams);
      }
    }
    resolved = segments.join('/') + query;
  }

  if (queryParams != null && queryParams.isNotEmpty) {
    final uri = Uri.parse(resolved);
    resolved = uri.replace(queryParameters: {
      ...uri.queryParameters,
      ...queryParams,
    }).toString();
  }

  return resolved;
}