Flutter 在 SharedPreferences 上保存对象

Flutter Save Object on SharedPreferences

我有一个工作 json 从我的商业 API 解析。除了将添加购物车产品存储到共享首选项外,其他一切正常。我怎样才能做到这一点?我收到类型错误

'ProductsModel' 不是类型 'Map<String, dynamic>' 的子类型;

这是我的 ProductsModel

    class ProductsList{
      final List<ProductsModel> products;
      ProductsList({this.products});
      factory ProductsList.fromJSON(List<dynamic> parsedJson){
        List <ProductsModel> productsList = new List<ProductsModel>();
        productsList = parsedJson.map((i) => ProductsModel.fromJSON(i)).toList();
        return new ProductsList(
          products: productsList
        );
      }
    }
    class ProductsModel {
      final int id;
      final String name;
      final String catalog_visibility;
      final String description;
      final String short_description;
      final String price;
      final String regular_price;
      final String sale_price;
      final String date_created;
    
      final List<CategoriesModel> categories;
      final List<ImagesModel> images;
      ProductsModel(
          {this.id,
          this.name,
          this.catalog_visibility,
          this.description,
          this.short_description,
          this.price,
          this.regular_price,
          this.sale_price,
          this.date_created,
          this.categories,
          this.images
          });
    
      factory ProductsModel.fromJSON(Map<String, dynamic> parsedJson) {
        var categoriesList = parsedJson['categories'] as List;
        var imagesList = parsedJson['images'] as List;
        List<ImagesModel> dataImages = imagesList.map((i) => ImagesModel.fromJSON(i)).toList();
        List<CategoriesModel> dataCategories =
        categoriesList.map((i) => CategoriesModel.fromJSON(i)).toList();
        return ProductsModel(
          id: parsedJson['id'],
          name: parsedJson['name'],
            catalog_visibility: parsedJson['catalog_visibility'],
            description: parsedJson['description'],
            short_description: parsedJson['short_description'],
            regular_price: parsedJson['regular_price'],
            sale_price: parsedJson['sale_price'],
            date_created: parsedJson['date_created'],
            categories: dataCategories,
          images: dataImages
        );
    
      }
    }
    
    class CategoriesModel {
      final int id;
      final String name;
    
      CategoriesModel({this.id, this.name});
      factory CategoriesModel.fromJSON(Map<String, dynamic> parsedJson) {
        return CategoriesModel(id: parsedJson['id'], name: parsedJson['name']);
      }
    }
    
    class ImagesModel{
      final int id;
      final String src;
      final String name;
    
      ImagesModel({this.id,this.src,this.name});
      factory ImagesModel.fromJSON(Map<String,dynamic> parsedJson){
        return ImagesModel(
          id: parsedJson['id'],
          src: parsedJson['src'],
          name: parsedJson['name']
        );
      }
    }

我正在测试仅通过使用此函数来存储 ProductsModel

这是我的函数

storedCart(products){
     SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('cart', products);
}

第 1 步: 在 class

中添加一个 toMap() 方法
Map<String,dynamic> toMap() {
    var map = new Map<String, dynamic>();
    map["id"] = id;
    map["name"] = name;
    map["description"] = description;
    // Add all other fields
    return map;
  }

第 2 步:将其存储在 SharedPreferences 中时调用对象的 toMap() 方法 这将 return 当前对象的 Map 表示。

Map<String,dynamic> productsMap = products.toMap();

第 3 步:使用 json.encode() 将对象转换为字符串并存储它!

storedCart(productsMap){
     SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('cart', json.encode(productsMap));
}

注:

  • 别忘了导入dart:convert
  • 检索对象时不要忘记使用 json.decode()

如果您无法理解我们为什么使用 json.encode(),请尝试在使用该函数前后打印对象,您会注意到当我们将对象转换为 JSON 时变成一个大字符串,因此我们可以使用“putString()”方法将它存储在SharedPreferences中。