parseQueryStringAll function

Map<String, List<String>> parseQueryStringAll(
  1. String location
)

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;
}