class MapState { final double zoom; final double centerLat; final double centerLng; final double bearing; MapState({ required this.zoom, required this.centerLat, required this.centerLng, required this.bearing, }); Map toJson() { return { 'zoom': zoom, 'centerLat': centerLat, 'centerLng': centerLng, 'bearing': bearing, }; } factory MapState.fromJson(Map json) { return MapState( zoom: json['zoom']?.toDouble() ?? 10.0, centerLat: json['centerLat']?.toDouble() ?? 39.9042, centerLng: json['centerLng']?.toDouble() ?? 116.4074, bearing: json['bearing']?.toDouble() ?? 0.0, ); } MapState copyWith({ double? zoom, double? centerLat, double? centerLng, double? bearing, }) { return MapState( zoom: zoom ?? this.zoom, centerLat: centerLat ?? this.centerLat, centerLng: centerLng ?? this.centerLng, bearing: bearing ?? this.bearing, ); } @override String toString() { return 'MapState(zoom: ' + zoom.toString() + ', centerLat: ' + centerLat.toString() + ', centerLng: ' + centerLng.toString() + ', bearing: ' + bearing.toString() + ')'; } @override bool operator ==(Object other) { if (identical(this, other)) return true; return other is MapState && other.zoom == zoom && other.centerLat == centerLat && other.centerLng == centerLng && other.bearing == bearing; } @override int get hashCode { return zoom.hashCode ^ centerLat.hashCode ^ centerLng.hashCode ^ bearing.hashCode; } }