class RideStop { final int id; int? actualStopDurationMinutes; double? additionalCharges; int? plannedStopDurationMinutes; DateTime? stopEndTime; final String stopLocation; DateTime? stopStartTime; DateTime? timestamp; RideStop({ required this.id, this.actualStopDurationMinutes, this.additionalCharges, this.plannedStopDurationMinutes, this.stopEndTime, required this.stopLocation, this.stopStartTime, this.timestamp, }); factory RideStop.fromJson(Map json) { DateTime? parseDate(dynamic v) { if (v == null) return null; if (v is String) { // ISO-string case return DateTime.tryParse(v); } if (v is int) { // millisecond-since-epoch? return DateTime.fromMillisecondsSinceEpoch(v); } if (v is List && v.length >= 6) { // [year, month, day, hour, minute, second, nanosecond?] final year = v[0] as int; final month = v[1] as int; final day = v[2] as int; final hour = v[3] as int; final min = v[4] as int; final sec = v[5] as int; // nanoseconds -> millisecond final ms = v.length >= 7 ? ((v[6] as int) / 1000000).round() : 0; return DateTime(year, month, day, hour, min, sec, ms); } return null; } return RideStop( id: json['id'] ?? 0, actualStopDurationMinutes: json['actualStopDurationMinutes'] as int? ?? 0, additionalCharges: (json['additionalCharges'] as num?)?.toDouble() ?? 0.0, plannedStopDurationMinutes: json['plannedStopDurationMinutes'] as int? ?? 0, stopEndTime: parseDate(json['stopEndTime']), stopLocation: json['stopLocation'] as String? ?? '', stopStartTime: parseDate(json['stopStartTime']), timestamp: parseDate(json['timestamp']), ); } Map toJson() => { 'id': id, 'actualStopDurationMinutes': actualStopDurationMinutes, 'additionalCharges': additionalCharges, 'plannedStopDurationMinutes': plannedStopDurationMinutes, 'stopEndTime': stopEndTime?.toIso8601String(), 'stopLocation': stopLocation, 'stopStartTime': stopStartTime?.toIso8601String(), 'timestamp': timestamp?.toIso8601String(), }; @override String toString() { return 'RideStop{id: $id, actualStopDurationMinutes: $actualStopDurationMinutes, additionalCharges: $additionalCharges, plannedStopDurationMinutes: $plannedStopDurationMinutes, stopEndTime: $stopEndTime, stopLocation: $stopLocation, stopStartTime: $stopStartTime, timestamp: $timestamp}'; } }