resolveRoutePath function
Builds a concrete URL from a route template (1.5.0).
pathParamsvalues replace:paramsegments. 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).queryParamsare merged into the query string, preserving any query already present inpage.
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;
}