class AppSettings { static const double kDefaultRentUsd = 2350; AppSettings({ required this.rentUsd, required this.occupied, this.notOccupiedFromYearMonth, this.localFallbackHour = 9, this.localQuietHourStart = 23, }); final double rentUsd; final bool occupied; final String? notOccupiedFromYearMonth; final int localFallbackHour; final int localQuietHourStart; factory AppSettings.defaults() { return AppSettings(rentUsd: kDefaultRentUsd, occupied: true); } AppSettings copyWith({ double? rentUsd, bool? occupied, String? notOccupiedFromYearMonth, bool clearNotOccupiedFromYearMonth = false, int? localFallbackHour, int? localQuietHourStart, }) { return AppSettings( rentUsd: rentUsd ?? this.rentUsd, occupied: occupied ?? this.occupied, notOccupiedFromYearMonth: clearNotOccupiedFromYearMonth ? null : (notOccupiedFromYearMonth ?? this.notOccupiedFromYearMonth), localFallbackHour: localFallbackHour ?? this.localFallbackHour, localQuietHourStart: localQuietHourStart ?? this.localQuietHourStart, ); } Map toJson() { return { 'rentUsd': rentUsd, 'occupied': occupied, 'notOccupiedFromYearMonth': notOccupiedFromYearMonth, 'localFallbackHour': localFallbackHour, 'localQuietHourStart': localQuietHourStart, }; } factory AppSettings.fromJson(Map json) { return AppSettings( rentUsd: (json['rentUsd'] ?? 0).toDouble(), occupied: json['occupied'] ?? true, notOccupiedFromYearMonth: json['notOccupiedFromYearMonth'] as String?, localFallbackHour: json['localFallbackHour'] ?? 9, localQuietHourStart: json['localQuietHourStart'] ?? 23, ); } }