Dart query string build and parse

Dart
String buildQuery(Map<String, Object?> params) {
  final pairs = <String>[];
  params.forEach((key, value) {
    if (value == null) return;
    if (value is Iterable) {
      for (final v in value) {
        pairs.add('${Uri.encodeQueryComponent(key)}=${Uri.encodeQueryComponent('$v')}');
      }
    } else {
      pairs.add('${Uri.encodeQueryComponent(key)}=${Uri.encodeQueryComponent('$value')}');
    }
  });
  return pairs.join('&');
}

Map<String, List<String>> parseQuery(String query) {
  final out = <String, List<String>>{};
  for (final entry in Uri.splitQueryString(query).entries) {
    out.putIfAbsent(entry.key, () => <String>[]).add(entry.value);
  }
  return out;
}