parseQueryStringAll function
Parses a URL or query string into a multi-value map preserving repeated keys.
Keys and values are percent-decoded, + is converted to spaces, and repeated
keys (e.g. ?tag=news&tag=tech) are collected into a List<String> in order of appearance.
Keys without values are assigned a list containing an empty string (['']).
If no query string is present, returns an empty map.
Safe for both server-side rendering (SSR) and browser environments.
final allParams = parseQueryStringAll('/filter?tag=web&tag=dart&sort=asc');
print(allParams['tag']); // ['web', 'dart']
print(allParams['sort']); // ['asc']
Implementation
Map<String, List<String>> parseQueryStringAll(String location) {
final query = _extractQueryString(location);
if (query.isEmpty) return const {};
final result = <String, List<String>>{};
for (final part in query.split('&')) {
if (part.isEmpty) continue;
final eqIdx = part.indexOf('=');
String rawKey;
String rawValue;
if (eqIdx == -1) {
rawKey = part;
rawValue = '';
} else {
rawKey = part.substring(0, eqIdx);
rawValue = part.substring(eqIdx + 1);
}
final key = Uri.decodeQueryComponent(rawKey);
final value = Uri.decodeQueryComponent(rawValue);
(result[key] ??= []).add(value);
}
return result;
}