0

I have a list of favourites:

List<MetroStation> favouriteData = <MetroStation>[];

And I also have a class of MetroStations with factory constructor to convert it to json and vice versa.

      class MetroStation {
  final String ukrName;
  final String engName;
  final double depth;
  final String iconImage;
  final TransitData? transitData;
  final BranchType branchType;
  bool isFavourite;

  MetroStation({
    required this.isFavourite,
    required this.branchType,
    this.transitData,
    required this.depth,
    required this.iconImage,
    required this.ukrName,
    required this.engName,
  });

  factory MetroStation.fromJson(Map<String, dynamic> json) => MetroStation(
      ukrName: json['ukrName'],
      engName: json['engName'],
      depth: json['depth'],
      iconImage: json['iconImage'],
      branchType: json['branchType'],
      isFavourite: json['isFavourite']);

  Map<String, dynamic> toJson() => {
        'ukrName': ukrName,
        'engName': engName,
        'depth': depth,
        'iconImage': iconImage,
        'branchType': branchType,
        'isFavourite': isFavourite
      };

I have created a class to Encode and Decode my list of Favourites.

   const futureSharedPreference = 'future shared preference';
 class SharedPref {


static  Future setMap() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.setString(futureSharedPreference, jsonEncode(favouriteData));
  }
 static Future<Map> getMap() async{
    final prefs = await SharedPreferences.getInstance();
    return jsonDecode(prefs.getString(futureSharedPreference) ?? '') ?? {};
  }
}

Here is my code to add and remove elements in favouriteData, where i`m also trying to use json.

setState(() {
                        if (station.isFavourite)  {
                          favouriteData.remove(station);
                          station.isFavourite = false;
                          debugPrint('-----------');
                          for (var element
                          in favouriteData) {
                            debugPrint(element.ukrName);
                          }
                          debugPrint('-----------');
                        } else {
                          favouriteData.add(station);
                          station.isFavourite = true;
                          debugPrint('-----------');
                          for (var element
                          in favouriteData) {
                            debugPrint(element.ukrName);
                          }
                          debugPrint('-----------');
                        }
                        debugPrint('$favouriteData');

                        SharedPref.setMap();
                      });
                    SharedPref.getMap().then((value) => print(value));}))

I get an this error in emulator. Please, help me. I don`t really know what to do.

1 Answers1

0

Try this way

static  Future setMap() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.setString(futureSharedPreference, jsonEncode(favouriteData.toJson())); // if favouriteData is a instance of MetroStation you can call toJson to create a encodable map
  }