import 'dart:collection'; import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; final class Landmark extends LinkedListEntry{ // A linked node of a list of Landmarks final String uuid; final String name; final List location; final LandmarkType type; final bool? isSecondary; // description to be shown in the overview final String? imageURL; final String? description; final Duration? duration; final bool? visited; // Next node // final Landmark? next; final Duration? tripTime; Landmark({ required this.uuid, required this.name, required this.location, required this.type, this.isSecondary, this.imageURL, this.description, this.duration, this.visited, // this.next, this.tripTime, }); factory Landmark.fromJson(Map json) { if (json case { // automatically match all the non-optionals and cast them to the right type 'uuid': String uuid, 'name': String name, 'location': List location, 'type': LandmarkType type, }) { // parse the rest separately, they could be missing final isSecondary = json['is_secondary'] as bool?; final imageURL = json['image_url'] as String?; final description = json['description'] as String?; final duration = json['duration'] as Duration?; final visited = json['visited'] as bool?; return Landmark( uuid: uuid, name: name, location: location, type: type, isSecondary: isSecondary, imageURL: imageURL, description: description, duration: duration, visited: visited); } else { throw FormatException('Invalid JSON: $json'); } } @override bool operator ==(Object other) { return other is Landmark && uuid == other.uuid; } } class LandmarkType { final String name; // final String description; // final Icon icon; const LandmarkType({ required this.name, // required this.description, // required this.icon, }); } // Helper (Landmark, String?) getLandmarkFromPrefs(SharedPreferences prefs, String uuid) { String? content = prefs.getString('landmark_$uuid'); Map json = jsonDecode(content!); String? nextUUID = json['next_uuid']; return (Landmark.fromJson(json), nextUUID); }