computeRouteMatrix static method

Future<List<RouteMatrixElement>> computeRouteMatrix({
  1. required String apiKey,
  2. required List<Waypoint> origins,
  3. required List<Waypoint> destinations,
  4. TravelMode mode = TravelMode.drive,
  5. Units units = Units.metric,
  6. String languageCode = 'pt-BR',
  7. String? fieldMask,
})

Computes an ETA matrix for multiple origins/destinations. Returns one element per origin x destination (sparse list with indices).

Implementation

static Future<List<RouteMatrixElement>> computeRouteMatrix({
  required String apiKey,
  required List<Waypoint> origins,
  required List<Waypoint> destinations,
  TravelMode mode = TravelMode.drive,
  Units units = Units.metric,
  String languageCode = 'pt-BR',
  String? fieldMask,
}) async {
  final body = <String, dynamic>{
    'origins': origins.map((o) => {'waypoint': o.toJson()}).toList(growable: false),
    'destinations': destinations.map((d) => {'waypoint': d.toJson()}).toList(growable: false),
    'travelMode': mode.nameGoogle,
    'languageCode': languageCode,
    'units': units.nameGoogle,
    'routingPreference': 'TRAFFIC_AWARE',
  };
  final mask = fieldMask ?? 'originIndex,destinationIndex,duration,distanceMeters,status';
  final uri = Uri.parse('$_baseMatrix?key=$apiKey');
  final res = await http.post(
    uri,
    headers: {
      'Content-Type': 'application/json',
      'X-Goog-FieldMask': mask,
    },
    body: jsonEncode(body),
  );
  if (res.statusCode != 200) {
    throw StateError('Route Matrix HTTP ${res.statusCode}: ${res.body}');
  }
  final lines = (jsonDecode(res.body) as List<dynamic>?) ?? const [];
  return [
    for (final item in lines) RouteMatrixElement.fromJson(item as Map<String, dynamic>)
  ];
}